Asp.net mvc 如何动态添加到ASP.NET MVC RouteTable?

Asp.net mvc 如何动态添加到ASP.NET MVC RouteTable?,asp.net-mvc,routing,routetable,Asp.net Mvc,Routing,Routetable,我们的网站上有一个区域,人们可以在那里注册,并在网站上获得自己的页面,我们希望在~/pageSlug上托管该页面。我曾尝试使用Global.asax中的一条规则来执行此操作,但这打破了允许~/Controller直接映射到索引操作的基本默认路径。我不被允许在userSlug前面放置任何类型的分隔符,因此~/p/pageSlug在这里实际上不是一个选项 在获取添加到路由的用户页面方面,我在App_Start中循环浏览这些页面,并显式地将它们添加到RouteTable中。这工作正常,我们已经设置了足

我们的网站上有一个区域,人们可以在那里注册,并在网站上获得自己的页面,我们希望在~/pageSlug上托管该页面。我曾尝试使用Global.asax中的一条规则来执行此操作,但这打破了允许~/Controller直接映射到索引操作的基本默认路径。我不被允许在userSlug前面放置任何类型的分隔符,因此~/p/pageSlug在这里实际上不是一个选项

在获取添加到路由的用户页面方面,我在App_Start中循环浏览这些页面,并显式地将它们添加到RouteTable中。这工作正常,我们已经设置了足够长的AppPool刷新时间,使其成为每天一次的任务。这确实给我们留下了一个24小时的周转期,让我们的用户“页面上线”,我正试图解决这个问题

理想情况下,我想做的是在用户注册后动态地将相关路由添加到RouteTable。我试过这样做:

RouteTable.Routes.Add(
    RouteTable.Routes.MapRoute(
        toAdd.UrlSlug + "Homepage", 
        toAdd.UrlSlug, 
        new { controller = "Controller", View = "View", urlSlug = toAdd.UrlSlug }
    )
);

但这似乎不起作用。我在其他任何地方都找不到解决方案,我确信我的代码非常幼稚,并且暴露出对路由的理解不足-请帮助

我认为您无法动态添加路由

看看这个问题,也许它会帮助你:

如果您尝试使用路由约束执行此操作,会怎么样。获取所有用户的列表,并约束所选路由以匹配该列表中的条目

public class UserPageConstraint : IRouteConstraint
{
    public static IList<string> UserPageNames = (Container.ResolveShared<IUserService>()).GetUserPageNames();

    bool _IsUserPage;
    public UserPageConstraint(bool IsUserPage)
    {
        _IsUserPage = IsUserPage;            
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (_IsUserPage)
            return UserPageNames.Contains(values[parameterName].ToString().ToLower());
        else
            return !UserPageNames.Contains(values[parameterName].ToString().ToLower());
    }
}
对于上述路由,在UserPageController的操作“index”中,我们将使用userPage作为参数

对于与userPage Home相关的其他路由,我们可以相应地添加路由。例如,可以按如下方式添加userdetails页面路由:

routes.MapRoute("UserHome", "{userPage}", new { controller = "UserPageController", action = "Index" }, new { userPage = new UserPageConstraint(true) });
routes.MapRoute("UserHome", "{userPage}/mydetails", new { controller = "UserPageController", action = "Details" }, new { userPage = new UserPageConstraint(true) });

您可以试试看。

我最近也意识到了这一点,而不是动态添加路由,我不确定不使用外部库(如 . 我相信,如果您的架构设计正确,路由约束就是您可能需要的全部。由于我的应用程序很小,所以我只使用一个实现的控制器,并动态创建其余的控制器(目前处于实验阶段,但应该可以工作)

考虑以下路线

routes.MapRoute(
  name: "ContactRequests_Operations",
  url: "ContactRequests-{operation}",
  defaults: new { controller = "Content", action = "Module_Direct", id =  "ContactRequests" , operation = "Get" }
  );

 routes.MapRoute(
    name: "Messages",
    url: "Messages",
    defaults: new { controller = "Content", action = "Direct", id ="Messages" }
);

嗯,我开始认为这可能是真的-通过代码调试,它看起来像RouteTable.Routes.Add()成功地增加了路由数量,但显然只针对该请求周期。它似乎无法将其保存到整个应用程序中使用的RouteTable中。@jsidnell-我记得有人要求动态创建区域(归结为新路线),但答案是“不支持”。对于我的多租户应用程序,我最终使用slug和自定义mvc处理程序创建了通用路由,以获取slug的值我已经解决了这个问题,但不要立即将代码交给我,并且不确定回答我自己问题的礼仪!如果有人能就后一部分提出建议,我很乐意让人们知道我是如何解决的:)回答你自己的问题并将其标记为正确是有效的。老问题,但如果可能的话,你能发布你的解决方案吗?无论是为了完整性,还是我有完全相同的问题:)都非常有用。在一个类似的场景中,我想要一个动态的“页面”控制器,其中的内容是从CMS用例的db加载的。