如何为 ASP.NET MVC 站点定义包罗万象的路由?
-
03-07-2019 - |
题
我有一个新闻网站,其中的文章按类别标记。
我的控制器称为“类别”,此 URL:
http://mysite.com/Category/Sport
通过 Sport
采取行动 Index
在控制器中 Category
.
我想允许以下 URL:
http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution
将所有类别信息传递给操作 Index
在控制器中 Category
.
如何创建一条包罗万象的路线来处理所有这些并将它们分类?
解决方案
对我的问题有一个很好的回答 这里.
其他提示
你可以这样做:
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() }
);
这样它就不会干扰您其他定义的路线。
不隶属于 StackOverflow