如何使用asp.net MVC路由创建Twitter风格的主页

时间:2009-11-12 05:42:55

标签: asp.net-mvc routes

我正在尝试创建twitter.com/rob以转到动态页面(使用account / viewuser),并允许twitter.com/help转到帮助页面(帮助/索引)。

以下代码无法以任何顺序运行,因为默认路由处理程序始终将ID作为控制器,因为控制器/操作/ ID都是可选的。

如果没有在global.asax.cs中预先定义网站中的每个页面,有没有办法做到这一点?


        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "UserHomepage",                                               // Route name
            "{id}",                                                       // URL with parameters
            new { controller = "Account", action = "ViewUser", id = "" }  // Parameter defaults
        );

3 个答案:

答案 0 :(得分:2)

您可以将第二个路径(“UserHomePage”)放在Default之前。路线按照它们在代码中出现的顺序进行评估。

也就是说,目前http://yoursite/转到http://yoursite/Home/Index,如果您进行了建议的更改,它将转到http://yoursite/Account/ViewUser(我不清楚Twitter与此有何关系)。您需要确定所需的行为,并相应地设计路线

答案 1 :(得分:0)

您可以在添加用户帐户路由之前添加无用户路由。前

routes.MapRoute(
            "About",                                               
            "About/{id}",                                                       
            new { controller = "About", action = "Index", id = "" }  
        );

routes.MapRoute(
            "Home",                                               
            "About/{id}",                                                       
            new { controller = "Home", action = "Index", id = "" }  
        );

routes.MapRoute(
        "UserHomepage",                                               
        "{id}",                                                       
        new { controller = "Account", action = "ViewUser", id = "" }  
    );

答案 2 :(得分:0)

首先放置“UserHomepage”路线。然后它应该像@Felix上面解释的那样做。尽可能在最后设置默认路由。

但它很棘手。您需要为其添加约束,因为即使您提供的是控制器名称,该路由也会触发。 e.g。

如果您有http://yoursite.com/home,我们希望这会按照默认路线上的定义转到您的“主页/索引”。但UserHomepage路由首先出现在默认值之前,因此我们预期不会发生,而http://yoursite.com/home将转到“account / viewuser / home”将home作为id。

对此的解决方案是定义约束。

我所做的是定义约束类

Public Class UserNameConstraint
    Implements IRouteConstraint

    Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
        Dim list As New List(Of String)
        list.Add("home") 'List of controller names

        For Each item In list
            If values("id").ToString() = item Then
                Return False
            End If
        Next

        Return True
    End Function
End Class

定义约束后,更改您的路线以包含约束

 routes.MapRoute( _
            "UserHomepage", _
            "{id}", _
            New With {.controller = "Case", .action = "FriendlyName"}, _
            New With {.id= New UserNameConstraint()} _
       )

如果在约束列表中列出了id,此路由现在将忽略。

多数民众赞成。希望你能理解。 :)