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

时间:2011-01-31 09:13:03

标签: asp.net-mvc routing routetable

我们的网站上有一个区域供人们注册,并在我们想要在〜/ pageSlug 上托管的网站上获得他们自己的页面。我尝试过在Global.asax中使用规则,但这打破了允许〜/ Controller 直接映射到Index操作的基本默认路由。我不被允许在userSlug前放置任何类型的分隔符,所以〜/ p / pageSlug 在这里不是一个真正的选项。

在将用户页面添加到路由方面,我正在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 }
    )
);

但这似乎不起作用。我无法在其他任何地方找到解决方案,而且我确信我的代码非常天真并且背叛了对路由的不了解 - 请帮忙!

3 个答案:

答案 0 :(得分:4)

如果您尝试使用路径约束,该怎么办?获取所有用户的列表并约束所选路由以匹配该列表中的条目

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

然后在Global.asax.cs中,为用户设置路由,如下所示:

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

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

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

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

你可以尝试一下,看看。

答案 1 :(得分:2)

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

考虑以下路线

 val x = $("#list > li").foreach(y => y)

答案 2 :(得分:0)

我认为你不能动态添加路线。

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