ASP.NET MVC學習之視圖篇(2)


ASP.NET MVC學習之視圖(1)學習

 

4.HTML輔助器

雖然在ASP.NET MVC中我們已經擺脫了ASP.NET控件,但是對於頁面中需要循環標簽的情況依然還是存在,可能很多人認為用foreach就可以完成,但是這個僅僅只是針對單個循環,如果多個循環中都要使用到同樣的標簽呢?下面筆者就介紹兩種方式讓我們事半功倍

 

首先是針對單個頁面的內聯輔助器,如果我們遇到只要在單個頁面中不斷使用的標簽的時候,這個方式非常的輕便,比如下面的代碼根據文本內容和樣式類生成li標簽的輔助器(Views/Home/Index.cshtml中):

 1 @helper CreateCssLi(String name,String css)
 2 {
 3     <li class="@css" >@name</li>
 4 }
 5 
 6 <ul>
 7     @foreach (var item in new[] { new { Name = "ADS", Css = "abs" }, new { Name = "adasd", Css = "afasf" } })
 8     {
 9         @CreateCssLi(item.Name, item.Css)
10     }
11 </ul>

 這里我們使用了 @helper 生成了一個內聯輔助器,並且在下面通過foreach使用了這個內聯輔助器,雖然內聯輔助器很輕便,但是對於需要在多個視圖中使用時,需要在每個頁面中寫入@helper,所以下面我們還要介紹外部輔助器,能夠讓我們在不同的頁面中也能夠使用,我們將上面的內聯輔助器改寫成如下的外部輔助器

 

首先我們新建一個Helper文件夾然后在其中新建一個HtmlHelperExt類,並在其中寫入如下代碼

 1 namespace MvcStudy.Helper
 2 {
 3     public static class HtmlHelperExt
 4     {
 5         public static MvcHtmlString CreateCssLi(this HtmlHelper s,String name,String css)
 6         {
 7             var li = new TagBuilder("li");
 8             li.AddCssClass(css);
 9             li.SetInnerText(name);
10             return new MvcHtmlString(li.ToString());
11         }
12     }
13 }

 

 

通過對HtmlHelper進行擴展,那么我們就可以在視圖中通過@Html使用我們擴展的方法了,當然僅僅完成這步還不夠,在ViewsWeb.config中添加這個命名空間:

 1 <pages pageBaseType="System.Web.Mvc.WebViewPage">
 2       <namespaces>
 3         <add namespace="System.Web.Mvc" />
 4         <add namespace="System.Web.Mvc.Ajax" />
 5         <add namespace="System.Web.Mvc.Html" />
 6         <add namespace="System.Web.Optimization"/>
 7         <add namespace="System.Web.Routing" />
 8         <add namespace="MvcStudy.Helper"/>
 9       </namespaces>
10 </pages>

 如果讀者不想修改配置文件,也有另外一個方法,就是將HtmlHelperExtnamespace改成System.Web.Mvc,最后的效果都一樣。

 

 

5.分段

相信很多從事ASP.NET的開發人員都使用過母版,而且我們會根據需要在母版中放入ContentPlaceHolder控件作為占位符,那么在最終的內容頁面中就會生成同樣多的Content控件,這樣我們就可以靈活的對頁面進行組合。當然這門技術在ASP.NET MVC中依然還是存在,當讀者新建一個基本的ASP.NET MVC項目后都會自動的新建好一個母版頁面,就是Views/Shared/Layout.cshtml,我們可以打開這個視圖,可以發現 @RenderBody() 方法,這個方法其實就是整個內容頁的占位符,當然大家一定會問那怎么實現跟ASP.NET一樣的效果呢,這個時候分段上場,我們修改_Layout.cshtml的代碼:

1 <body>
2     @RenderSection("head")
3 
4     @RenderBody()
5 
6     @RenderSection("foot")
7     @Scripts.Render("~/bundles/jquery")
8     @RenderSection("scripts", required: false)
9 </body>

 

這里通過調用@RenderSection輸出內容頁中的headfoot,剩下來我們修改Views/Home/Index.cshtml視圖:

1 @section head{
2     <h1>來自head</h1>
3 }
4 
5 <h1>來自body</h1>
6 
7 @section foot{
8     <h1>來自foot</h1>
9 }

 

通過使用@section划分段,然后在其中就可以寫入內容了,最后我們可以看到效果如下所示

 

但是我們將Index.cshtml中刪除一個分段后重新打開,就會報錯。因為有時候我們內容頁不需要在某個分段中寫入內容,如果像上面這樣就意味着即使不需要使用也要寫這個分段,從而影響視圖,當然這個也是有解決方案的,下面我們重新修改_Layout.cshtml面:

 1 <body>
 2     @RenderSection("head")
 3 
 4     @RenderBody()
 5 
 6     @if(IsSectionDefined("foot"))
 7     {
 8         @RenderSection("foot")
 9     }
10     else
11     {
12         <h1>默認的foot</h1>
13     }
14     
15     @Scripts.Render("~/bundles/jquery")
16     @RenderSection("scripts", required: false)
17 </body>

 這里我們首先通過@IsSectionDefined判斷某個分段是否存在,如果存在則輸出,否則輸出默認內容,但是我們發現這樣還是有點麻煩,有時候我們並沒有默認內容,如果不存在這個分段就不顯示,所以我們還可以繼續修改成如下所示:

 1 <body>
 2     @RenderSection("head")
 3 
 4     @RenderBody()
 5 
 6 
 7         @RenderSection("foot",false)
 8 
 9     
10     @Scripts.Render("~/bundles/jquery")
11     @RenderSection("scripts", required: false)
12 </body>

 我們僅僅在@RenderSection輸入了第二個參數為false,這個參數的含義就是這個分段是否是可選。

 

 

6.分布視圖

上面我們采用了兩種輔助器都可以減少我們輸入html的數量,但是並不能書寫大量的html代碼,所以我們還需要一中能夠將大量html進行合並,以便視圖中隨時使用,這個時候我們就可以使用分布視圖了,首先我們在Views/Shared下新建視圖:

這個要勾選!

 

筆者的命名為PartialTest,然后我們可以在其中隨意寫什么。接着我們在Views/Home/Index.cshtml中使用這個分布視圖

1 @section head{
2     <h1>來自head</h1>
3 }
4 
5 <h1>來自body</h1>
6 
7 @Html.Partial("PartialTest")

 

最后我們看到最終的頁面中輸出了分布視圖的內容。但是這種方式僅僅只能解決簡單的功能,如果你的分布視圖需要涉及到一點功能性的代碼,那么它操作起來就比較麻煩了,所以下面我們還需要子動作的幫助。首先我們在Views/Home/Index中新建一個ChildAction視圖(注意需要把Layout設置為NULL),然后在Home控制器中寫入如下代碼:

1         [ChildActionOnly]
2         public ActionResult ChildAction()
3         {
4             ViewBag.Msg = "來自子動作";
5             return View();
6         }

 

同時我們還需要修改Views/Home/Index視圖中的代碼如下:

1 @section head{
2     <h1>來自head</h1>
3 }
4 
5 <h1>來自body</h1>
6 
7 @Html.Action("ChildAction")

 

這里注意我們使用的是@Html.Action而不是@Html.Partial,然后我們重新build下然后刷新頁面就可以看到子動作的內容了:

 

關於ASP.NET MVC自帶的Html輔助器筆者這里就不介紹了,因為相關的教程很多,而且使用很快就能上手,至此ASP.NET MVC的視圖部分就到此為止了。

 

 


免責聲明!

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



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