2011-01-31 77 views
3

我们在我们的网站上有一个区域,人们可以注册并在我们想要在〜/ pageSlug上主办的网站上给自己的页面。我已经尝试使用Global.asax中的规则来做这件事,但是这打破了允许〜/ 控制器直接映射到Index操作的基本默认路由。我没有被允许在userSlug前放置任何类型的分隔符,所以〜/ p/pageSlug在这里并不是真正的选择。如何动态添加到ASP.NET MVC RouteTable?

在获取添加到路由中的用户页面方面,我在App_Start中循环浏览页面并明确地将它们添加到RoutesTable中。这工作正常,并且我们已经将AppPool刷新设置足够长的时间以使其成为一天一次的任务。这确实让我们有24小时的周转时间来为我们的用户“获得网页直播”,尽管我正在努力解决这个问题。

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

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

但这似乎并没有工作。我无法在其他任何地方找到解决方案,并且我确定我的代码非常幼稚,并且背离了对路由的不理解 - 请帮助!

+0

我已经解决了这一个,但没有代码立即手,不知道回答我的问题的礼仪!如果任何人可以建议后者,我很乐意让人们知道我是如何修复它:) – jonsidnell 2011-03-04 16:44:48

+2

回答你自己的问题,并将其标记为正确的是有效的。老问题,但如果可能,你可以发布你的解决方案吗?为了完整性和事实,我有完全相同的问题:) – Will 2013-02-26 20:01:16

回答

0

我不认为你可以动态添加路由。

看看这个问题,也许它会帮助你: ASP.NET MVC custom routing for search

+0

嗯,我开始认为这可能是真实的 - 通过代码调试,它看起来像RouteTable.Routes.Add()成功地增加了路线,但显然只适用于该请求周期。它似乎没有将其持续到整个应用程序使用的RouteTable。 – jonsidnell 2011-01-31 10:52:20

2

如果您尝试这个,使用路由约束是什么。快把所有用户的名单和约束所选择的路线,在列表中Global.asax.cs中的条目相匹配

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()); 
    } 
} 

然后,设置一个路由,用户如下:

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

对于这个上面的路由,在UserPageController的操作'index'中,我们将用userPage作为参数。

对于其他相对于userPage Home的路由,我们可以相应地添加路由。例如,可以将用户详细页面路由添加如下:

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

您可以试试看看。

1

我最近刚刚意识到这一点,而不是动态添加路由,我不确定可以这样做,而无需使用外部库,如Route Magic 。我相信,如果你正确地设计你的架构,那么你只需要Routing Constraint。由于我的应用程序很小,我只使用一个实现的控制器并动态地创建其余的(实验在此刻,但它应该工作)。

考虑以下途径

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" } 
);