覆盖MVC中生成的链接
问题描述:
是否有一种简单的方法来覆盖MVC为我生成的链接,以便始终能够处理另一个值。覆盖MVC中生成的链接
例如http://www.site.com/ {控制器}/{动作}总是呈现为http://www.site.com/ {控制器}/{行动} /鲍勃其中鲍勃是每个用户特有的,并使用上涨到生成的每个链路的末端@ Html.ActionLink或@ Url.ActionLink。
我是否需要重写每个方法或者是否存在其他地方我可以插入此逻辑?
答
这听起来更像是你真的想要一个自定义的URL路由方案。这是大部分ActionLink重载中的“路由值”参数。您可以为该方法提供值,这些值用于填充映射路由中的值。默认情况下,单一的路由具有附加到它,所以你的情况,你可以做到这一点“ID”的值:
@Html.ActionLink("link", "Home", "Index", new { id = "bob" })
,你会得到,看起来网址,如:
http://www.site.com/Home/Index/bob
如果你需要的ID参数,也可以在那里,你可以任意添加新元素的路线图,在Global.asax中的代码隐藏:
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)
}
(根据需要添加额外的过载;只通过“空”的动作,控制器,数据等,如果你想使用默认值。)