2012-02-16 58 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) 
} 

(根據需要添加額外的過載;只通過「空」的動作,控制器,數據等,如果你想使用默認值。)