ASP.NET MVC之視圖生成URL(二)


前言

上一節我們講述了MVC中從控制器到視圖傳遞數據的四種方式,想必大家早已掌握了,那我們繼續往下走。

話題

在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>

結果如下:

一切都是那么的合情合理,結果也正確,不要忘記了,我們這節要說的是@Html.ActionLink,別跑題了,到此為止,我們忘記這一切,繼續之前的話題。

我們確實要創建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,如下:

貌似沒有什么可看的,我們知道上述 this is generate url dynamic 鏈接是由如下而生成的:

 @Html.ActionLink("this is generate url dynamic", "MyBlog")

我們用到HtmlHelper的擴展方法ActionLink,上述我們是重載了第一個方法,第一個參數是鏈接文本,而第二個則是Action名稱,但是我們並未給出其控制器名稱即控制器未知。我們把鼠標放在該鏈接上看看,如下:

到這里想必我們大概能知道 @Html.ActionLink 的作用了,我們回歸起初的話題我們利用 <a href="/Home/Index">這是一個鏈接</a> 將控制器寫死,當我們刪除該控制器那后果可想而知,當我們通過上述利用@Html.ActionLink來實現時則是通過控制器來動態生成該鏈接,即使我們刪除控制器創建一個新的控制器該鏈接會動態的重新生成,這才是在MVC中要給出@Html.ActionLink的最后渲染成a標簽的真正作用所在。下面我們繼續進行該探討。

@Html.ActionLink探討(二)

我們再來定義一個Blog控制器,如下:

    public class BlogController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Controller = "Blog";
            ViewBag.Action = "Index";
            return View("DisplayActionView");
        }
        public ActionResult Comments()
        {
            ViewBag.Controller = "Blog";
            ViewBag.Action = "Comments";
            return View("DisplayActionView");
        }
    }

我們在DisplayActionView視圖中添加訪問Blog控制器的Comments方法,如下:

     <h3>
        @Html.ActionLink("This is a Blog controller", "Comments", "Blog")
    </h3>

我們在路由配置中在上述已經路由中再配置一個,如下:

               routes.MapRoute("BlogRoute", "ASP.NET_MVC_2/Blog{action}",
               new { controller = "Test" });

我們運行程序,得到如下結果:

我們看到上述@Html.ActionLink鏈接地址,我們點擊進去看看:

從這里看到了 @Html.ActionLink 的真正作用,同時我們也知道MVC對於Web Form的一大優勢,路由配置的靈活以及虛擬路徑的配置。

結語 

由上述已驗證,我們知道@Html.ActionLink不僅僅是寫一個控制器和Action方法然后渲染成a標簽進行跳轉,它的靈活上述我們已經闡述完畢,希望通過此節的描述讓大家能明白@Html.ActionLink真正用處並切實體會到動態生成url的妙處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM