在MVC的Web應用程序中,我們經常會出現這樣的操作,從一個視圖跳轉到另外一個視圖,大部分情況下都是通過鏈接來實現,當然這是一種非常不錯的選擇,為什么不說這是最好的選擇呢?因為它也有其弊端,我們看看如下:
<a href="/Home/Index">這是一個鏈接</a>
當我們點擊這個鏈接時,Home則對應的是控制器,Index則對應的是Action方法,並發出此請求進行跳轉,貌似沒有半點錯誤,但是,但是,如果我某一天想改變這個URL鏈接呢?要是我想刪除Home控制器決定創建一個新的控制器呢,那又該怎么辦呢?那這個寫死的鏈接不就失效了嗎,也就是說無法正常進行跳轉了!不用着急,在MVC中提供一種更加好的方式來解決這個問題,通過路由來實現並解決這個問題最終動態生成URL
在MVC中跳轉視圖生成鏈接的方式我們都知道是用 @Html.ActionLink 來進行,利用它的第四個重載方法,如:
@Html.ActionLink("這是一個跳轉到Action鏈接","Index","Home")
第一個參數為鏈接文本,第二個為控制器上對應的方法Index,最后一個則是控制器Home,最終渲染成html則是:
<a href="/Home/About">這是一個跳轉到Action鏈接</a>
到了這里你覺得是不是@Html.ActionLink的作用也就是如此了,是不是覺得這個來自HtmlHelper的擴展方法也不過如此呢?
@Html.ActionLink探討(一)
我們創建項目並創建如下一個Test控制器,並在該控制器上定義如下兩個方法:
public class TestController : Controller { public ActionResult Index() { ViewBag.Controller = "Test"; ViewBag.Action = "Index"; return View("DisplayActionView"); } public ActionResult MyBlog(string id = "MyBlogId") { ViewBag.Controller = "Test"; ViewBag.Action = "MyBlog"; ViewBag.CustomVariable = id; return View(); } }
看了上述定義的Index方法返回的視圖是DisplayActionView視圖,那我們是不是應該在該控制器下做出如下定義呢:
public ActionResult DisplayActionView() { return View(); }
然后在該視圖中顯示一下我們已經跳轉到該視圖了呢,如下:
<div> <h1>DisplayActionView</h1> </div>
結果如下:
我們確實要創建DisplayActionView視圖只是我們不創建該Action方法,我們直接在Views文件夾下的Shared文件夾下定義該視圖。如下:
<body> <h1>Controller Invoked: @ViewBag.Controller</h1> <h1>Action Invoked: @ViewBag.Action</h1> <h3> @Html.ActionLink("this is generate url dynamic", "MyBlog") </h3> </body>
當然在上述Test控制器里還有個MyBlog方法未定義視圖,我們定義視圖內容如下:
<body> <h3>Controller processed the URL: @ViewBag.Controller</h3> <h3>Controller action invoked: @ViewBag.Action</h3> <h3>The custom variable is: @ViewBag.CustomVariable</h3> </body>
最后我們進行下路由配置:
routes.MapRoute("CustomRoute", "{controller}/{action}/{id}", new { controller = "Test", action = "Index", id = UrlParameter.Optional });
下面我們運行下程序看看其結果,通過運行Test下的Index方法然后直接跳轉到DisplayActionView,如下:
@Html.ActionLink("this is generate url dynamic", "MyBlog")
我們用到HtmlHelper的擴展方法ActionLink,上述我們是重載了第一個方法,第一個參數是鏈接文本,而第二個則是Action名稱,但是我們並未給出其控制器名稱即控制器未知。我們把鼠標放在該鏈接上看看,如下:
@Html.ActionLink 的作用了,我們回歸起初的話題我們利用 <a href="/Home/Index">這是一個鏈接</a> 將控制器寫死,當我們刪除該控制器那后果可想而知,當我們通過上述利用@Html.ActionLink來實現時則是通過控制器來動態生成該鏈接,即使我們刪除控制器創建一個新的控制器該鏈接會動態的重新生成,這才是在MVC中要給出@Html.ActionLink的最后渲染成a標簽的真正作用所在