是否有一种简单的方法可以覆盖MVC为我生成的链接,以便我可以始终使用其他值。
例如http://www.site.com/ {controller} / {action}始终呈现为http://www.site.com/ {controller} / {action} / bob,其中bob对每个用户都是唯一的,并添加到每个链接的末尾使用@ Html.ActionLink或@ Url.ActionLink生成。
我是否需要覆盖每个方法,还是在其他地方我可以插入此逻辑?
答案 0 :(得分:1)
这听起来更像是你真的想要一个自定义的URL路由方案。这就是"路由值"大多数ActionLink重载的参数是。您可以为该方法提供用于填充映射路由中的值的值。默认情况下,单个路由的值为" id"附加到它,所以在你的情况下你可以这样做:
@Html.ActionLink("link", "Home", "Index", new { id = "bob" })
你会得到一个如下的网址:
http://www.site.com/Home/Index/bob
如果您还需要id参数,可以在Global.asax代码隐藏中将任意新元素添加到Route映射:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{user}/{id}", // URL with parameters
new
{
controller = "Home",
action = "Index",
user = "guest",
id = UrlParameter.Optional
} // Parameter defaults
);
现在您可以使用以下任何一项:
@Html.ActionLink("link", "Home", "Index", new { id = 1 })
@Html.ActionLink("link", "Home", "Index", new { user = "bob" })
@Html.ActionLink("link", "Home", "Index", new { user = "bob", id = 1 })
你会分别得到:
http://www.site.com/Home/Index/guest/1
http://www.site.com/Home/Index/bob
http://www.site.com/Home/Index/bob/1
MVC路由非常强大,但是像大多数功能强大的东西一样复杂。 This article为您提供了很好的介绍。它是为旧版本的MVC编写的,但基础知识是相同的(只需将路径中的[]改为{}。)
此外,如果您不想记住为每个调用添加用户参数,您可以创建自己的HtmlHelper或UrlHelper扩展方法来为您执行此操作:
public static MvcHtmlString MyActionLink ( this HtmlHelper html, string text, string action, string controller, IDictionary<string, object> attrs)
{
var data = new { user = GetTheUser() };
return html.ActionLink(text, action, controller, data, attrs)
}
(根据需要添加额外的重载;如果你想使用默认值,只需传递&#34; null&#34;用于动作,控制器,数据等。)