2012-11-30 12 views
7

Ich versuche, einige Routing-Einschränkungen mit der neuesten asp.net mvc 4-Architektur arbeiten. Unter App_Start befindet sich eine Datei namens RouteConfig.cs.Wie verwende ich Constraints in ASP.net MVC 4 RouteConfig.cs?

Wenn ich den Constraints-Abschnitt aus meinem Beispiel unten entferne, funktioniert die URL. Aber ich muss einige Einschränkungen hinzufügen, damit die URL nicht auf alles passt.

Sollte funktionieren:/Videos/Rating/1

shold nicht:/videos/2458/Text-goes-Hier

Das ist, was ich habe:

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = UrlParameter.Optional, Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]", Page = @"\d+"} 
); 

Antwort

11

Wenn Sie Wenn Sie mehrere optionale Parameter auf derselben Route wünschen, treten Probleme auf, da Ihre URLs immer die erste angeben müssen, um die zweite zu verwenden. Nur weil Sie Constraints verwenden, wird die Auswertung der Parameter nicht gestoppt.

dieses Nehmen Sie zum Beispiel: /videos/3

Wenn diese übereinstimmen versucht, findet es Videos und sagt: „OK, ich immer noch übereinstimmen“. Dann schaut es sich den nächsten Parameter an, der Sort ist, und er erhält den Wert 3 und vergleicht ihn dann mit der Einschränkung. Die Einschränkung schlägt fehl, und daher heißt es "OPPS, ich passe nicht zu dieser Route" und es geht weiter zur nächsten Route. Um die Seite ohne den definierten Sortierparameter festzulegen, sollten Sie stattdessen 2 Routen definieren.

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]+", Page = @"\d+"} 
); 

//URL: /videos/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = "the actual default sort value", Page = UrlParameter.Optional }, 
    constraints: new { Page = @"\d+"} 
); 

Ich habe die meisten spezifischen Routen zuerst, wenn möglich, und am Ende mit dem geringsten spezifischen, aber in diesem Fall ist die Reihenfolge aufgrund der Zwänge sollte keine Rolle spielen. Was ich unter spezifisch verstehe, sind die am meisten definierten Werte. In diesem Fall müssen Sie die Sortierung in der ersten Route definieren, und Sie können auch die Seite angeben, also ist sie spezifischer als die Route mit nur dem Seitenparameter.

+0

Danke, das half ein paar Probleme zu klären. – Maddhacker24

1

vielleicht Mein Eingang ziemlich spät, aber für answers.To für andere Benutzer immer noch Dinge einfach halten, ich die folgende in meiner RoutesConfig Datei

routes.MapRoute(
    name: "Videos", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "VideoList", action = "Index", id="" }, 
    constraints: new { id = @"\d+"} 
    ); 

Je nach Wahl der Implementierung verwenden würde, könnte id sein UriParameter .Optional, aber in diesem Szenario wird es id = "" sein, weil wir zur Laufzeit einen String/int übergeben werden.

Dieser Stil angenommen von http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

Eine Sache im Auge immer vereinbarungs Controller-Klassen zu halten mit Controller enden z VideoListController Klasse. Diese Klasse sollte die folgende Methode enthält

public ActionResult Index(string id) 
{ 
    // note this maps to the action 
    // random implementation 
    ViewBag.Message=id; 
    View() 
} 

// beachten Sie, dieser Ansatz noch eine beliebige Zeichenfolge Spiele unter dem Controller-Ordner aufgelistet ... nur ganze Zahlen übereinstimmen, wurde die Index-Methode

public ActionResult Index(int id) 
{ 
    // note this maps to the action 
    ViewBag.Message=id; 
    View() 
} 
neu geschrieben werden

Konsequenterweise funktioniert dieser Ansatz für VideoList/Index/12 , aber beim Setzen von VideoList/Index/somorandomtext wird während der Laufzeit ein Fehler ausgegeben. Dies könnte durch Verwenden von Fehlerseiten gelöst werden. Ich hoffe, das hilft. Stimmen Sie ab, wenn es ziemlich nützlich ist.