2008-10-20 72 views
8

我有一个新闻网站的文章标签类别。如何为ASP.NET MVC网站定义一条catch-all路由?

我的控制器被称为 “A类”,这网址:

http://mysite.com/Category/Sport

在控制器Category传递Sport行动Index

我想允许下列网址:

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

其中通过在控制器Category所有类别的信息采取行动Index

如何创建一个处理所有这些并将它们转到类别的全路径?

回答

2

对这个问题沿着这些线here有一个很好的回应。

+0

hanks jmcd ...让我走上了正确的轨道,我想出了其余的。 (stackoverflow很好) – WayneDV 2008-10-21 19:08:13

0

你可以这样说:

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

,然后在你的控制器:

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

不要任何以上将被用于所有路线(路线,你不能有一个关于页面等,除非你在上面指定了显式路由)。

但是,您可以包含一个自定义约束,以将路线限制为仅存在的类别。喜欢的东西:

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; 
    } 
} 

,你在你的路线使用这样的:

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

以这种方式,不会与其他定义的路由干扰。