我正在定义我的行动链接:
@Html.ActionLink("Visit profile By Name", "UserProfile", "User", new { UserId = 2, UserName = "Sandeep" }, null)
生成链接:
如果username == string.empty
(作为用户名动态发送),则链接变为
但在这种情况下,我希望我的链接看起来像这样:
路由表值:
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
);
答案 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。