如果您不介意在要爲其生成URL的控制器中的每個操作旁邊添加方法,則可按以下步驟操作。與lambda表達式方法相比,這有一些缺點,但也有一些提升。
實現: -
添加到您的控制器您想要強類型的URL生成每個動作方法......
// This const is only needed if the route isn't already mapped
// by some more general purpose route (e.g. {controller}/{action}/{message}
public const string SomeMethodUrl = "/Home/SomeMethod/{message}";
// This method generates route values that match the SomeMethod method signature
// You can add default values here too
public static object SomeMethodRouteValues(MessageObject messageObject)
{
return new { controller = "Home", action = "SomeMethod",
message = messageObject };
}
您可以在路由映射代碼中使用這些.. 。
Routes.MapRoute ("SomeMethod",
HomeController.SomeMethodUrl,
HomeController.SomeMethodRouteValues(null));
而且你可以在任何地方使用它們,你需要生成一個鏈接到行動: - 如
<%=Url.RouteUrl(HomeController.SomeMethodValues(new MessageObject())) %>
如果你做這種方式...
1)你在你的代碼只是一個地方的參數的任何行動被定義
2)只有一個方式這些參數轉換爲路由,因爲Html.RouteLink和Url.RouteUrl都可以將HomeController.SomeMethodRouteValues(...)作爲參數。
3)很容易設置任何可選路由值的默認值。
4)很容易重構你的代碼而不會破壞任何網址。假設你需要爲SomeMethod添加一個參數。你所要做的就是改變SomeMethodUrl和SomeMethodRouteValues()以匹配新的參數列表,然後在代碼或視圖中修改所有的斷開引用。試着用新的{action =「SomeMethod」,...}來分散你的代碼。
5)您將獲得Intellisense支持,以便您可以查看需要哪些參數來構建任何操作的鏈接或網址。至於「強類型」,這種方法似乎比使用lambda表達式更好,因爲沒有編譯時或設計時錯誤檢查鏈接生成參數是否有效。
缺點是,你仍然需要保持這些方法與實際操作方法同步(但它們可以在代碼中彼此相鄰,以便於查看)。純粹主義者無疑會反對這種方法,但實際上,它發現並修復了一些錯誤,否則這些錯誤需要測試才能找到,並且正在幫助替換我們以前在WebForms項目中使用的強類型Page方法。