2016-10-31 1 views
1

Ich habe 2 Routen übereinstimmen, aber ich brauche sie beide zu entsprechen, wie sie sind. Ich kann GUID oder INT nicht verwenden, ich brauche es als Strings.MVC Route Attribut findet mehrere Controller-Typen

Diese Route sollte nur verwendet werden, wenn sie nicht mit anderen übereinstimmen.

[Route("{slug}", Order = 1)] 

und dieser Weg sollte immer

[Route("eula", Order = 0)] 

Jede Idee genommen werden ist, wie dies zu erreichen? Ich dachte Bestellung könnte funktionieren anscheinend ist es nicht

Zeige meine genaue Ausgabe: Route parameters and multiple controller types

den Fehler nachzuarbeiten:

RouteConfig.cs:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapMvcAttributeRoutes(); 
    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

Controller:

public class HomeController : Controller 
{ 
    [Route("eula")] 
    public ActionResult Eula() 
    { 
     ViewBag.Message = "Your application description page."; 

     return View(); 
    } 
} 

public class SlugController : Controller 
{ 
    [Route("{slug}")] 
    public ActionResult SluggedUrl(string slug) 
    { 
     ViewBag.Message = "Your " + slug; 

     return View(); 
    } 
} 

Antwort

1

Die Route des Slug-Controllers ist zu allgemein. Das Attribut Order gilt auch für Aktionen im selben Controller.

Vorschlag: Fügen Sie eine Konvention basierte Route für den Slug

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

    routes.MapMvcAttributeRoutes(); 

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

    //catch all route 
    routes.MapRoute(
     name: "Slug", 
     url: "{*slug}", 
     defaults: new { controller = "Slug", action = "SluggedUrl"} 
    ); 
} 

Und entfernen Attribut Route Form SlugController

public class SlugController : Controller { 
    public ActionResult SluggedUrl(string slug) { 
     ViewBag.Message = "Your " + slug; 

     return View(); 
    } 
} 

diese Weise die spezifischere eula Attribut Route vor dem allgemeineren erhalten angepasst werden slug Route