我正在使用MVC 5创建一个CMS的缩减版本,我正试图通过路由方面的事情。
我需要处理包含/how-it-works/
和/about-us/
等网址的网页,因此内容会锁定在这些路径上。
在我的RouteConfig
文件中,我正在使用'catch all'路线,如下所示::
routes.MapRoute("Static page", "{*path}", new { controller = "Content", action = "StaticPage" });
这成功点击我正在查看的控制器操作,但是这意味着对实际存在的控制器操作的请求(例如/navigation/main
也会在此路由下发送)。
我知道我可以拥有一个匹配/navigation/main
的路由但是我宁愿配置MVC来默认这样做,就像我不添加上面的规则时那样,任何想法?< / p>
答案 0 :(得分:2)
添加你的&#34;赶上所有&#34;路线在&#34;默认&#34;之上路由并添加route constrain
到这样的路径:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Static page",
"{*path}",
new { controller = "Content", action = "StaticPage" }
new { path = new PathConstraint() });
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
}
PathConstraint
应来自IRouteConstraint
界面,可以是这样的:
public class PathConstraint: IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (values[parameterName] != null)
{
var permalink = values[parameterName].ToString();
//gather all possible paths from database
//and check if permalink is any of them
//return true or false
return database.GetPAths().Any(p => p == permalink);
}
return false;
}
}
所以如果&#34;路径&#34;不是您的页面路径之一,PathConstrain将不会被满足和&#34;静态页面&#34;路线将被滑雪并传递到下一条路线。