C#MVC将动态指定的路由重定向到固定操作

C#MVC将动态指定的路由重定向到固定操作,c#,asp.net-mvc,routing,C#,Asp.net Mvc,Routing,我使用的是C#MVC 我有一个动作看起来像这样 public class CustomController : Controller { public ActionResult CustomPage(int customPageId) { var model = new CustomPageViewModel() { customPageId = customPageI

我使用的是C#MVC

我有一个动作看起来像这样

    public class CustomController : Controller
    {
        public ActionResult CustomPage(int customPageId)
        {
            var model = new CustomPageViewModel()
            {
                customPageId = customPageId
            };

            return View(model);
        }
    }
我希望能够打这个动作,但使用不同的路线。例如,我希望Home/Index实际执行此操作,但要在URL中报告它的Home/Index

我的自定义页面存储在数据库中,该数据库告诉它要有什么路由,如何以编程方式为我的页面创建路由,并让MVC执行所需的操作

由于这是一个基于CMS的系统,我不想创建一个主/索引控制器和操作,因为用户可以选择他们想要的任何路线


谢谢,汤姆。仅供参考:我已经大致弄明白了。不幸的是,路由是在应用程序启动时定义的,因此如果我想在应用程序运行时设置新路由,我必须强制重新启动

这是我用来设置路线的代码,以防它对其他人有帮助

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

        var pageList = new PageService().Get();

        foreach (var page in pageList)
        {
            var targetRoute = string.Format("{1}/{2}", page.PageArea, page.PageController, page.PageAction);

            if (!string.IsNullOrWhiteSpace(page.PageArea))
                targetRoute = string.Format("{0}/{1}/{2}", page.PageArea, page.PageController, page.PageAction);

            routes.MapRoute(
                string.Format("PageBuilder_{0}", page.PageId),
                targetRoute,
                new { area = "Builder", controller = "Build", action = "Index", pageId = page.PageId }
            );
        }

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

仅供参考:我已经大致弄明白了。不幸的是,路由是在应用程序启动时定义的,因此如果我想在应用程序运行时设置新路由,我必须强制重新启动

这是我用来设置路线的代码,以防它对其他人有帮助

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

        var pageList = new PageService().Get();

        foreach (var page in pageList)
        {
            var targetRoute = string.Format("{1}/{2}", page.PageArea, page.PageController, page.PageAction);

            if (!string.IsNullOrWhiteSpace(page.PageArea))
                targetRoute = string.Format("{0}/{1}/{2}", page.PageArea, page.PageController, page.PageAction);

            routes.MapRoute(
                string.Format("PageBuilder_{0}", page.PageId),
                targetRoute,
                new { area = "Builder", controller = "Build", action = "Index", pageId = page.PageId }
            );
        }

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

更好的方法是在运行时使用一个或多个路由集合,而不是修改路由集合。更好的方法是在运行时使用一个或多个路由集合,而不是修改路由集合。