动态添加到RouteTable不起作用

时间:2012-01-31 15:55:35

标签: c# model-view-controller asp.net-mvc-routing

我目前正在为一个应用程序写一篇新闻文章方面,我将新路由(对于新文章)添加到我的RouteTable,它似乎添加正常,但路由无法访问?

我使用的代码如下:

var routes = RouteTable.Routes;
using (routes.GetWriteLock())
{
    var url = contentHelper.GetPageUrl(page);
    routes.MapRoute(page.Id.ToString(), url, new { controller = "Cms", action = "Index", id = url }, new[] { "Web.Controllers.CmsController" });
}

正如我之前所说,新的Url被添加到RouteTable.Routes但我无法访问该页面。重新启动后,它将被Global.asax中的RegisterRoutes选中并正常工作。

任何关于此问题的亮点都会很棒,因为我希望在不强制重启应用的情况下实现这一目标

修改

这是我的global.asax

中的RegisterRoutes
public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("LogOff", "LogOff", new { controller = "Account", action = "LogOff" });

        routes.MapRoute(
                "News", // Route name
                "News/",// URL with parameters
                new { controller = "NewsPage", action = "Index" }, // Parameter defaults
                new[] { "Web.Controllers.NewsController" }
            );

        //register all content pages
        var urls = new ContentPageHelper().GetAllUrls();
        foreach (var url in urls)
        {
            routes.MapRoute(url.Key.ToString(), url.Value, new { controller = "Cms", action = "Index", id = url.Key }, new[] { "Web.Controllers.CmsController" });
        }

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}",// URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

2 个答案:

答案 0 :(得分:4)

问题是调用RouteTable.MapRoute会将路由添加到表的末尾。您的默认路由通常是要添加到表中的最后一条路由,但由于您在构建路由表后动态调用RouteTable.MapRoute,因此默认路由在到达新添加的路由之前将被命中。 / p>

我对此问题的解决方法如下。

    public static void AddContentRoute(this RouteCollection routes, Data.UrlMap map, bool needsLock = false)
    {
        var route = new Route(map.Url, new MvcRouteHandler());
        route.Defaults = new RouteValueDictionary(new
        {
            controller = "Content",
            action = "Display",
            id = map.Id,
            type = map.Type
        });

        if (needsLock)
        {
            using (routes.GetWriteLock())
            {
                routes.Insert(0, route);
            }
        }
        else
        {
            routes.Insert(0, route);
        }
    }

这基本上做了RouteTable.MapRoute所做的事情,但是将路线插入到表格的顶部而不是结尾。

如果您有其他需要坐在表格顶部的路线,您可能需要修改此解决方案。

答案 1 :(得分:-1)

为什么要动态创建路线?当应用程序自行重启应用程序时,这不会失败的目的,所有这些路径都需要重新创建才能让它们工作

为什么不创建一个只处理所有cms请求的路由?

routes.MapRoute("CmsPage", "{page}", new { controller = "Cms", action = "Index"}, new [] { "Web.Controllers.CmsController" });

如果你这样做它不会与应用程序中的其他路由/控制器发生冲突,你总是可以在所有cms生成的页面前加上页面。我正在为我现在正在创建的CMS网站执行此操作。

routes.MapRoute("CmsPage", "pages/{page}", new { controller = "Cms", action = "Index"}, new [] { "Web.Controllers.CmsController" });

您在控制器中的操作与此类似

public ActionResult Index(string page) 
{
    // logic to load page
    return View();
}