Динамическое добавление в RouteTable не работает - PullRequest
0 голосов
/ 31 января 2012

В настоящее время я пишу аспект новостной статьи в приложение и добавляю новый маршрут (для новой статьи) в свой 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, но я не могу попасть на страницу.После перезапуска он регистрируется RegisterRoutes в Global.asax и работает нормально.

Любой индикатор, который вы можете пролить на это, был бы великолепен, так как я хочу добиться этого без принудительного перезапуска приложения

РЕДАКТИРОВАТЬ

Это RegisterRoutes из моего global.asax

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 ]

4 голосов
/ 04 февраля 2012

Проблема заключается в том, что вызов RouteTable.MapRoute добавляет маршрут в конец таблицы. Маршрут по умолчанию, как правило, является последним маршрутом, добавляемым в таблицу, но, поскольку вы динамически вызываете RouteTable.MapRoute после того, как вы уже создали свою таблицу маршрутов, маршрут по умолчанию вызывается до того, как он достигает вновь добавленного маршрута.

Мое решение этой проблемы было следующим.

    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, но вместо конца вставляет маршрут в верхнюю часть таблицы.

Если у вас есть другие маршруты, которые должны находиться в верхней части таблицы, вы можете изменить это решение.

0 голосов
/ 31 января 2012

Зачем вам создавать маршрут на лету? Не противоречит ли это цели, когда приложение выполняет перезапуск приложения самостоятельно, все эти маршруты должны быть воссозданы, чтобы они работали

Почему бы не создать маршрут, который просто обрабатывает все запросы к вашему 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();
}
...