我目前正在为一个应用程序写一篇新闻文章方面,我将新路由(对于新文章)添加到我的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
中的RegisterRoutespublic 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
);
}
答案 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();
}