如何为ASP.NET MVC站点定义catch-all路由?

时间:2008-10-20 15:36:56

标签: asp.net-mvc routes

我有一个新闻网站,其中的文章标记为类别。

我的控制器名为“类别”,此网址为:

  

http://mysite.com/Category/Sport

Sport传递给控制器​​Index中的操作Category

我想允许以下网址:

  

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

将所有类别信息传递给控制器​​Index中的操作Category

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

2 个答案:

答案 0 :(得分:2)

我的问题对这些问题有很好的回应here

答案 1 :(得分: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() }
);

以这种方式,它不会干扰您的其他定义路线。