使用帶有路由名稱的@Html.RouteLink
只是指示路由引擎使用該名稱的路由。這很容易理解,而且顯然任何寫博客條目或文檔的人都會試圖解釋RouteLink。未提供路由名稱時,使用RouteLink生成URL的方法是什麼?
我明白,這是首選的方法,我也一直使用RouteLink的路由名稱,但我想知道它是如何工作的,當我們不知道時,我無法找到任何真正的好信息。因此,該方法的問題是:
public static MvcHtmlString RouteLink(
this HtmlHelper htmlHelper,
string linkText,
RouteValueDictionary routeValues
)
,並在MSDN上,it's not explained at all所有有趣的東西是一致的。
Haacked.com has examples of using RouteLink以這種方式:
routes.MapRoute(
name: "Test",
url: "code/p/{action}/{id}",
defaults: new { controller = "Section", action = "Index", id = "" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = "" }
);
@Html.RouteLink("Test", new {controller="section", action="Index", id=123})
@Html.RouteLink("Default", new {controller="Home", action="Index", id=123})
當我閱讀,我認爲這是一個錯字,這兩個實際上綁定到「默認」,但沒有它的實際工作。與文本「測試」的鏈接產生爲https://localhost:44301/code/p/Index/123
。
這似乎是「錯誤的」,因爲對於我來說,默認值通常在沒有提供時使用,但在這裏它們被用作生成過程中的查找值。這很奇怪和鬆散,我不記得曾經這樣做過,也不能想到爲什麼我會這樣做。
如果我這樣做:
@Html.RouteLink("Test", new {controller="sectionA", action="Index", id=123})
它不工作,但如果我這樣做:
@Html.RouteLink("Test", new {controller="section", action="IndexA", id=123})
它仍然這樣做似乎只有控制值是顯著,但它是完全只要生成的網址一直未使用。
https://localhost:44301/code/p/Index/123
在Haacked.com,菲爾說:
甚至還有更多的細節我已經掩蓋了具有與 路由的默認值是如何計算到URL代做。這是另一次 的主題,但它解釋了爲什麼不通過 路由到具有不帶參數的URL的控制器操作時遇到此問題。
但似乎他沒有回到那個話題。我查看了源代碼,但是我深入30個調用,並且漫無目的地進入抽象類,並且我現在無法從符號服務器中單步穿過它。
那麼它就像「控制器名稱變成路由名稱,在URL生成過程中沒有實際路由名稱」一樣簡單?如果是這樣,他們爲什麼要這樣做?
感謝您的回答。我已經深深地挖了一下,再深一點。我可能應該在帖子的標題中使用「規則」這個詞,而不是「方法」。我認爲所有這些發揮的實際方法是System.Web.Routing.Route.Match。 – rism 2015-02-10 22:01:35