В MVC-5 я смог отредактировать routetable
после первоначального запуска, обратившись к RouteTable.Routes
. Я хочу сделать то же самое в MVC-6, чтобы добавлять/удалять маршруты во время выполнения (полезно для CMS).
Код для этого в MVC-5:
using (RouteTable.Routes.GetWriteLock())
{
RouteTable.Routes.Clear();
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Но я не могу найти RouteTable.Routes
или что-то подобное в MVC-6. Любая идея, как я могу изменить коллекцию маршрутов во время выполнения?
Я хочу использовать этот принцип для добавления, например, дополнительного URL-адреса, когда страница создается в CMS.
Если у вас есть класс:
public class Page
{
public int Id { get; set; }
public string Url { get; set; }
public string Html { get; set; }
}
И контроллер вроде:
public class CmsController : Controller
{
public ActionResult Index(int id)
{
var page = DbContext.Pages.Single(p => p.Id == id);
return View("Layout", model: page.Html);
}
}
Затем, когда страница добавляется в базу данных, я воссоздаю routecollection
:
var routes = RouteTable.Routes;
using (routes.GetWriteLock())
{
routes.Clear();
foreach(var page in DbContext.Pages)
{
routes.MapRoute(
name: Guid.NewGuid().ToString(),
url: page.Url.TrimEnd('/'),
defaults: new { controller = "Cms", action = "Index", id = page.Id }
);
}
var defaultRoute = routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Таким образом, я могу добавлять страницы в CMS, которые не принадлежат к условностям или строгим шаблонам. Я могу добавить страницу с url /contact
, но также страницу с url /help/faq/how-does-this-work
.