【问题标题】:How do I define a catch-all route for an ASP.NET MVC site?如何为 ASP.NET MVC 站点定义包罗万象的路由?
【发布时间】:2008-10-20 15:36:56
【问题描述】:

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

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

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

我如何创建一个包罗万象的路线来处理所有这些并将它们穿梭到类别中?

【问题讨论】:

    标签: asp.net-mvc routes


    【解决方案1】:

    按照here,我的问题得到了很好的回应。

    【讨论】:

    • hanks jmcd ...这让我走上了正确的道路,我想出了其余的。 (stackoverflow 很棒)
    • 在 SO 上不鼓励仅链接答案。
    【解决方案2】:

    你可以这样做:

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

    这样它就不会干扰您定义的其他路线。

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 2011-10-13
      • 2021-08-25
      • 2011-04-02
      • 1970-01-01
      • 2011-02-12
      • 2014-05-05
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多