带有多个参数的MVC3路由问题

时间:2011-07-31 13:30:51

标签: asp.net-mvc asp.net-mvc-3

我正在定义我的行动链接:

 @Html.ActionLink("Visit profile By Name", "UserProfile", "User", new { UserId = 2, UserName = "Sandeep" }, null)

生成链接:

  

http://localhost:2010/User/UserProfile/Sandeep/2

如果username == string.empty(作为用户名动态发送),则链接变为

  

http://localhost:2010/User/UserProfile?UserId=2

但在这种情况下,我希望我的链接看起来像这样:

  

http://localhost:2010/User/UserProfile/2

路由表值:

       routes.MapRoute(
           "UserName", // Route name
           "User/UserProfile/{UserName}/{UserId}", // URL with parameters
           new { controller = "User", action = "UserProfile", UserName = UrlParameter.Optional, UserId = UrlParameter.Optional } // Parameter defaults
       );

3 个答案:

答案 0 :(得分:3)

更改路线

routes.MapRoute( "UserName", // Route name 
              "User/UserProfile/{UserName}/{UserId}", // URL with parameters 
               new { 
                   controller = "User", 
                    action = "UserProfile", 
                    UserName = "UserProfile",  /*change this */
                     UserId = UrlParameter.Optional 
                  }  // Parameter defaults 
                 );

UserName = UrlParameter.Optional更改为UserName = "UserProfile"

答案 1 :(得分:0)

我认为你想要的是制作两条路线。

routes.MapRoute("UserName",                             // Route name
                "User/UserProfile/{UserNameId}", // URL with parameters
                new { controller = "User", 
                      action = "UserProfile"
);

routes.MapRoute("UserName",                             // Route name
                "User/UserProfile/{UserName}/{UserId}", // URL with parameters
                new { controller = "User", action = "UserProfile"
);

然后在UserProfile(string userNameId)方法中,您将检查userNameId是否为数字,如果是,则设置UserId,否则设置UserName。

默认情况下,路线没有真正的方法可以知道差异。你可以使用正则表达式,但这样做有很多陷阱......所以它不适合胆小的人。

如果您的模式没有发送用户名或ID,则可能需要添加默认值。

答案 2 :(得分:0)

这简化了Mystere Man的回答。

routes.MapRoute("UserName",
                "User/UserProfile/{UserName}/{UserId}",
                new { controller = "User", action = "UserProfile" }
);

routes.MapRoute("UserIdOnly",
                "User/UserProfile/{UserId}",
                new { controller = "User", action = "UserProfile" }
);

您需要做的就是删除路线中的UrlParameter.Optional并指定第二条路线。 url看起来http://localhost:2010/User/UserProfile?UserId=2的原因是因为它与您的UserName路由不匹配,而是与默认路由匹配:

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

我颠倒了Mystere Man路由的顺序,并将UserNameId参数更改为UserId。如果UserName为null或为空,则它将与UserName路由不匹配,但将匹配第二个(UserIdOnly)路由并为您提供所需的URL。