2014-05-19 8 views
6

Ich habe mehrere Routen konfiguriert, aber aus irgendeinem Grund, trotz der Regeln für verschiedene Controller und unterschiedliche Ansichten, verschiedene Links Routing auf die gleiche Ansicht.MVC 5 Routing-Problem - Mehrere Routen zielen falsch auf die gleiche Ansicht

RouteConfig.cs

using System.Web.Mvc; 
using System.Web.Routing; 

namespace WebApplication1 
{ 
    public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "Account", 
       url: "Account/{action}/{id}", 
       defaults: new { controller = "Account", id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Member", 
       url: "Member/{action}/{id}", 
       defaults: new { controller = "Member", id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Root", 
       url: "{action}/{id}", 
       defaults: new { controller = "Home", id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
        name: "Details", 
        url: "{controller}/{action}/{u}", 
        defaults: new 
        { 
         controller = "Member", 
         action = "Details", 
         u = UrlParameter.Optional 
        } 
      ); 

      routes.MapRoute(
       name: "Article", 
       url: "{Home}/{Article}/{id}/{articleName}", 
       defaults: new { controller = "Home", action = "Article" } 
      ); 

      routes.MapRoute(
       name: "Item", 
       url: "{News}/{Item}/{id}/{itemName}", 
       defaults: new { controller = "News", action = "Item" } 
      ); 
     } 
    } 
} 

Verbindungen

http://localhost:11508/Home/Article/2/Participate 
http://localhost:11508/News/Item/2/Second-Test 

so kann Wie sehen, die Links und Regeln: Bitte siehe unten, ich habe meine RouteConfig Datei und Beispiel Links unten enthalten sind sicherlich einzigartig, aber aus irgendeinem Grunde wird die Item-Regel ignoriert, es ist einfach Id 2 zu der Home/Artikel Ansicht vorbei.

+0

Registrieren Sie Ihre Route vor der Standardroute und versuchen Sie es erneut. –

+0

Hier ist ein Tipp: Verwenden Sie [Attribut-Routing] (http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2), es funktioniert auch für MVC. – Knelis

Antwort

1

Sie sollten Controller-/Aktionsnamen nicht in Klammern angeben - übergeben Sie sie einfach so, dass der Pfad angepasst werden kann. Ihre letzten beiden Strecken sollte wie folgt aussehen:

 routes.MapRoute(
      name: "Article", 
      url: "Home/Article/{id}/{articleName}", 
      defaults: new { controller = "Home", action = "Article" } 
     ); 

     routes.MapRoute(
      name: "Item", 
      url: "News/Item/{id}/{itemName}", 
      defaults: new { controller = "News", action = "Item" } 
     ); 

Auch ist es gut, solche spezifischen Routen vor andere Routen zu setzen, nicht nach Standardrouten.

UPDATE

Grundsätzlich sollte es gesonderte Frage, aber es ist einfacher, es gerade hier zu beantworten.

Von Kommentar:

wie kann ich http://localhost:11508/Member/Details?u=testuser-http://localhost:11508/Member/Details/testuser anstelle einer Darstellung Parameter weitergeleitet werden.

  1. erstellen Controller-Aktion, die diesen Parameter akzeptiert, wie diese:

    public ActionResult Details(string u, ...) 
    { 
        var model = new ... 
        ... 
        return View(model); 
    } 
    
  2. Register Route, die u Parameter als URL Teil akzeptiert, wie diese

    routes.MapRoute(
         name: "MyRoute", 
         url: "Member/Details/{u}", 
         defaults: new { controller = "Member", action = "Details", u = UrlParameter.Optional } 
        ); 
    

    hier {u} erklärt eigentlich Parameternamen, und wie es verwendet werden soll (analysiert/gerendert) in Seite URL.

  3. Link auf die URL Render wie diese:

    <a href="@Url.Action("Details", "Member", new {u = "testuser"})">linktext</a> 
    

In all diesen Schritten ist u, dass Name des Parameters, die Sie verwenden möchten.

+0

Vielen Dank, das hat sich gelohnt, jetzt muss ich nur herausfinden, wie ich 'http: // localhost: 11508/Mitglied/Details? U = testuser' zu' http: // localhost weitergeleitet bekommen kann: 11508/Member/Details/testuser' anstelle eines Zeige-Parameters. – iggyweb

+0

@iggyweb Antwort ist nicht kurz genug, also habe ich Post mit Antwort aktualisiert. Ich denke, Sie müssen über Routing und wie es in MVC funktioniert lesen, um es besser zu verstehen. – Lanorkin

+0

Vielen Dank für Ihr Feedback, mein Controller akzeptiert bereits die Variable 'u', die' public ActionResult Details (String u) 'die URL' http: // localhost: 11508/Member/Details? U = testuser' funktioniert, aber ich möchte es als 'http: // localhost: 11508/Member/Details/testuser' rendern, habe die Route und den Link aber noch keine Freude geändert. Mein Link war '@ Html.ActionLink (item.UserName," Details ", neu {Controller =" Member ", u = item.UserName})' – iggyweb

0

Ihr Problem ist, in der Reihenfolge, in der Sie Ihre Routen registrieren. Die Regel ist, dass man sie von den spezifischsten für die am wenigsten registrieren sollte. Mit anderen Worten: Ihre „default“ Route (n) sollte der allerletzte sein.

Wie Sie es jetzt haben, MVC bekommt einen Treffer auf Ihrer Standardroute, weil Ihre item Route das entspricht, sobald es darauf trifft, hört es auf nach anderen Routen zu suchen und verwendet es.

Verschieben Sie Ihre item Route an den Anfang Ihrer RegisterRoutes Methode und es sollte gut funktionieren.

+0

Ich habe versucht, Routen "Root" und "Default" zum Ende zu bewegen und endete mit Http 400 Bad Request Error. Also habe ich versucht, 'Article' und' Item' nach oben zu verschieben, unterhalb von 'routes.IgnoreRoute (" {resource} .axd/{* pathInfo} ");' aber wieder wird die Item-Route ignoriert. – iggyweb

1

Die Zuordnung übernimmt die erste übereinstimmende Regel. Die "Item" -Route würde nie verwendet werden, da der Article-Root alle Requests abfängt, die "Item" -Route entsprechen könnten. Überprüfen Sie die Reihenfolge der Routen und löschen Sie die {} umgebenden Nachrichten.

routes.MapRoute(
      name: "Item", 
      url: "News/Item/{id}/{itemName}", 
      defaults: new { controller = "News", action = "Item" } 
     );