覆盖MVC中的生成链接

时间:2012-02-16 23:49:27

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

是否有一种简单的方法可以覆盖MVC为我生成的链接,以便我可以始终使用其他值。

例如http://www.site.com/ {controller} / {action}始终呈现为http://www.site.com/ {controller} / {action} / bob,其中bob对每个用户都是唯一的,并添加到每个链接的末尾使用@ Html.ActionLink或@ Url.ActionLink生成。

我是否需要覆盖每个方法,还是在其他地方我可以插入此逻辑?

1 个答案:

答案 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;用于动作,控制器,数据等。)