2012-02-16 100 views
0

是否有一种简单的方法来覆盖MVC为我生成的链接,以便始终能够处理另一个值。覆盖MVC中生成的链接

例如http://www.site.com/ {控制器}/{动作}总是呈现为http://www.site.com/ {控制器}/{行动} /鲍勃其中鲍勃是每个用户特有的,并使用上涨到生成的每个链路的末端@ Html.ActionLink或@ Url.ActionLink。

我是否需要重写每个方法或者是否存在其他地方我可以插入此逻辑?

回答

1

这听起来更像是你真的想要一个自定义的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) 
} 

(根据需要添加额外的过载;只通过“空”的动作,控制器,数据等,如果你想使用默认值。)