CMS页面的MVC路由

时间:2015-03-30 08:28:58

标签: asp.net-mvc asp.net-mvc-4 routing routes

我正在使用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>

1 个答案:

答案 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;路线将被滑雪并传递到下一条路线。