2008-10-20 10 views
8

Ich habe eine Nachrichtenseite mit Artikeln in Kategorien getaggt.Wie definiere ich eine Catch-all-Route für eine ASP.NET MVC-Site?

Mein Controller "Kategorie" und diese URL genannt:

http://mysite.com/Category/Sport

geht Sport zur Aktion Index in Controller Category.

Ich möchte die folgenden URLs ermöglichen:

http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution

Welche alle Aktionen Informationen zur Kategorie geht Index in Controller Category.

Wie erstelle ich eine Catch-All-Route, die alle diese behandelt und sie in die Kategorie pendelt?

Antwort

2

Es gibt eine ziemlich gute Antwort auf meine Frage in dieser Richtung here.

+0

hanks jmcd ... das hat mich auf die richtige Spur gebracht und ich habe den Rest herausgefunden. (stackoverflow ist super) – WayneDV

+2

Link-only-Antworten werden von SO abgeraten. – spender

0

Sie können es wie folgt tun:

routes.MapRoute("Default", "{category}/{subcategory}", 
    new { controller = "CategoryController", action = "Display", id = "" } 
); 

und dann in Ihrem Controller:

public class CategoryController : Controller 
{ 
    public ActionResult Display(string category, string subcategory) 
    { 
     // do something here. 
    } 
} 

Sie nicht, dass jeder die Strecke für alle Routen verwendet werden oben (Sie können nicht haben eine Info-Seite usw., sofern Sie keine expliziten Routen vor dem obigen angeben).

Sie könnten jedoch eine benutzerdefinierte Einschränkung hinzufügen, um die Route auf nur vorhandene Kategorien zu beschränken. Etwas wie:

public class OnlyExistingCategoriesConstraint : IRouteConstraint 
{ 
    public bool Match 
     (
      HttpContextBase httpContext, 
      Route route, 
      string parameterName, 
      RouteValueDictionary values, 
      RouteDirection routeDirection 
     ) 
    { 
     var category = route.DataTokens["category"]; 
     //TODO: Look it up in your database etc 


     // fake that the category exists 
     return true; 
    } 
} 

, die Sie in Ihre Route wie folgt verwenden:

routes.MapRoute("Default", 
    "{category}/{subcategory}", 
    new { controller = "CategoryController", action = "Display", id = "" }, 
    new { categoryExists = new OnlyExistingCategoriesConstraint() } 
); 

Auf diese Weise wird es nicht mit anderen definierten Routen stören.