【问题标题】:MVC routing for CMS pagesCMS 页面的 MVC 路由
【发布时间】:2015-06-03 04:36:25
【问题描述】:

我正在使用 MVC 5 创建 CMS 的精简版本,并且我正在尝试解决路由方面的问题。

我需要处理带有诸如 /how-it-works//about-us/ 等 URL 的页面,因此内容是在这些路径上键入的。

在我的RouteConfig 文件中,我正在使用“catch all”路线,如下所示::

routes.MapRoute("Static page", "{*path}", new { controller = "Content", action = "StaticPage" });

这成功命中了我正在寻找的控制器操作,但因此这意味着对确实存在的控制器操作的请求(例如 /navigation/main 也沿着这条路线发送)。

我知道我可以有一个匹配 /navigation/main 的路由,但是我宁愿将 MVC 配置为默认执行此操作,就像我不添加上面的规则时那样,有什么想法吗?

【问题讨论】:

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


【解决方案1】:

在“默认”路由之上添加您的“catch all”路由,并在路径中添加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;
        }
    }

因此,如果“路径”不是您的页面路径之一,则不会满足 PathConstrain 并且将跳过“静态页面”路由并传递到下一个路由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多