首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >启动后更改MVC6的路由集合

启动后更改MVC6的路由集合
EN

Stack Overflow用户
提问于 2015-09-14 21:13:08
回答 2查看 8.7K关注 0票数 23

在MVC-5中,我可以通过访问RouteTable.Routes在初始启动后编辑routetable。我希望在MVC-6中做同样的事情,这样我就可以在运行时添加/删除路由(用于CMS)。

在MVC-5中执行此操作的代码为:

代码语言:javascript
复制
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 }
    );
}

但我在MVC-6中找不到RouteTable.Routes或类似的东西。你知道我如何在运行时仍然可以改变路由收集吗?

例如,当在CMS中创建页面时,我想使用这个原则来添加额外的url。

如果你有一个这样的类:

代码语言:javascript
复制
public class Page
{
    public int Id { get; set; }
    public string Url { get; set; }
    public string Html { get; set; }
}

和一个控制器,比如:

代码语言:javascript
复制
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

代码语言:javascript
复制
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的页面。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32565768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档