【MVC】View的使用

/Views/_ViewStart.cshtml 文件會在其餘視圖文檔被加載以前被載入,代碼以下:html

1 @{
2     Layout = "~/Views/Shared/_Layout.cshtml";
3 } 

標誌主板頁爲_Layout.cshtml。_ViewStart.cshtml文件一樣能夠出如今Views子目錄下,實現不一樣的控制器下預設載入不一樣的主版頁面。_Layout.cshtml代碼結構:web

複製代碼
 1         <header>
 2             <div>...</div>
 3         </header>
 4         <div id="body">
 5             @RenderSection("featured", required: false)
 6             <section class="content-wrapper main-content clear-fix">
 7                 @RenderBody()
 8             </section>
 9         </div>
10         <footer>
11             <div>...</div>
12         </footer>
複製代碼

注意代碼中的@RenderSection和@RenderBody,@RenderBody在Razor主版頁面中能夠視爲「預設坑洞」,也就是說View視圖會被填入到@RenderBody的位置。數據庫

@RenderSection在Razor主版頁面中能夠被視爲「具名坑洞」,若是把required具名參數指定爲true的話,那麼全部載入這個主版頁面的View頁面都必須在@RenderSection中輸出相應的內容,不然將產生異常。而「featured」就是坑洞的名字,由於required爲false,因此沒必要填充該具名坑洞。MVC模板項目中Index.cshtml是這樣填充的,以下:mvc

複製代碼
 1 @section featured {
 2     <section class="featured">
 3         <div class="content-wrapper">
 4             <hgroup class="title">
 5                 <h1>@ViewBag.Title.</h1>
 6                 <h2>@ViewBag.Message</h2>
 7             </hgroup>
 8             <p>
 9                 To learn more about ASP.NET MVC visit
10                 <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
11                 The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC.
12                 If you have any questions about ASP.NET MVC visit
13                 <a href="http://forums.asp.net/1146.aspx/1?MVC" title="ASP.NET MVC Forum">our forums</a>.
14             </p>
15         </div>
16     </section>
17 }
複製代碼

Razor頁面有固定的執行順序,先執行View在執行Layout主版頁面,由於View與Layout公用一個ViewDataDictionary實體,所以能夠經過ViewBag將數據從View傳遞到Layout頁面中,但反過來並不成立。app

 

2,@helper輔助方法asp.net

將View頁面中的部份內容或部分代碼抽取出來,變成一個獨立的輔助方法。{不要重複你本身的原則},示例代碼以下:編輯器

複製代碼
 1 <table>
 2     @foreach (var item in Model)
 3     {
 4         <tr>
 5             <td>
 6                 @GenerateStr(item.ID)
 7             </td>
 8             <td>
 9                 @item.Name
10             </td>
11         </tr>
12     }
13 </table>
14 
15 @helper GenerateStr(int id)
16 {
17     <text>NO</text>@id
18 }
複製代碼

聲明@Helper輔助方法與C#中聲明方法的方法很是相似,差異就是不用回傳任何類型。
若是要將這個@helper輔助方法用在多個不一樣的View裏,能夠將@helper輔助方法獨立出來,放置在根目錄App_Code中。ide

注:添加App_Code文件夾的方式也很講究,在項目中右鍵-->添加Asp.Net文件夾-->選擇App_Code便可。而後在該文件夾中添加布局文件(cshtml){以習慣取代配置}模塊化

而後將以前編寫的@helper方法拷貝進來就能夠了。假如說添加了UIHelper.cshtml,並聲明瞭GenerateStr(int ID)方法,那麼會聲明一個UIHelper類,調用方式以下:函數

@UIHelper.GenerateStr(item.ID)

 @helper輔助方法的缺陷:@helper輔助方法只可以簡單的傳入參數,格式化成想要的樣式輸出,爲此Razor提供了@functions自定義函數功能。

先經過@functions定義一個代碼區域,而後把C#代碼寫在裏面,若是方法將執行的結果返回給View頁面,則必須以IHtmlString類型返回。示例:

複製代碼
1 @functions{
2     public IHtmlString GetYesterday()
3     {
4         var theDay = DateTime.Now.AddDays(-1);
5         return new HtmlString(theDay.ToShortDateString());
6     }
7 }
複製代碼

 一樣@functions方法能夠用於多個不一樣的View中共享。不過須要注意,此時應該把@functions中的方法設置爲static{靜態方法的使用方式}

 

3,@using引入命名空間:

1 @using HelloMVC_2.Models
2 @model IEnumerable<HelperTestModel >

 注意:在Views目錄中存在web.config文件,<namespaces>區段設置全部View頁面都會引入的命名空間,能夠將經常使用的命名空間添加到這裏,以下:

複製代碼
1       <namespaces>
2         <add namespace="System.Web.Mvc" />
3         <add namespace="System.Web.Mvc.Ajax" />
4         <add namespace="System.Web.Mvc.Html" />
5         <add namespace="System.Web.Optimization"/>
6         <add namespace="System.Web.Routing" />
7       </namespaces>
複製代碼


 

4,View如何從Action取得數據

使用弱類型取得數據/使用強類型取得數據。前者使用ViewData、ViewBag或TempData,也能夠經過@Model屬性,但Model屬性的類型爲object,因此是弱型別。

強型別的方式從Controller中取得數據,在View用@model聲明專用類型 如:@model Namespace.MyModel,使用強型別類型的一個好處是,可使用VS的智能提示的功能。

用ViewData.Model傳遞數據的示例代碼以下:

複製代碼
 1         public ActionResult Test()
 2         {
 3             List<HelperTestModel> list = new List<HelperTestModel>()
 4             {
 5                 new HelperTestModel(){ID=1,Name="Bill"},
 6                 new HelperTestModel(){ID=2,Name="Paul"}
 7             };
 8             ViewData.Model = list;
 9             return View();
10         }
11 
12 @using HelloMVC_2.Models
13 
14 @{var temp =         (System.Collections.Generic.IEnumerable<HelperTestModel>)Model;}
15 @foreach(var item in temp)
16 {
17     <li>@item.ID</li>
18 }
複製代碼

注意到使用弱類型傳遞至View,改用強型別操做時,須要強制類型轉換。注意@using 引入命名空間的使用。

 

5,@HTML輔助方法

以@Html.DropDownList()爲例,代碼以下:

複製代碼
 1             //Controller中代碼示例
 2             List<HelperTestModel> list = new List<HelperTestModel>()
 3             {
 4                 new HelperTestModel(){ID=1,Name="Bill"},
 5                 new HelperTestModel(){ID=2,Name="Paul"}
 6             };
 7             //ViewData.Model = list;
 8             ViewData["List"] = new SelectList(list, "ID", "Name");
 9             return View();
10             //View中代碼示例
11             @Html.DropDownList("List",ViewData["List"] as SelectList)            
複製代碼

其中SelectList,是專門提供給項目列表有關的數據類型,如Html.DropDownList()和Html.ListBox()
強類型的輔助方法:在原有名稱上加上For,好比:Html.LabelFor();必須用@model定義View頁面的參考數據模型。示例代碼以下:

複製代碼
 1     //Model中
 2     public class Product
 3     {
 4         public int Id { get; set; }
 5         [Required]
 6         [DisplayName("產品名稱")]
 7         public string Name { get; set; }
 8         [Required]
 9         [DisplayName("產品說明")]
10         public string Description { get; set; }
11        [Required]
12         public int UnitPrice { get; set; }
13     }
14     //View中
15 @model HelloMVC_2.Models.Product
16 
17 @using (Html.BeginForm())
18 {
19     @Html.ValidationSummary(true)
20     <fieldset>
21         <legend>產品資訊</legend>
22         <div class="editor-label">
23             @Html.LabelFor(model=>model.Name)
24         </div>
25         <div class="efitor-field">
26             @Html.TextAreaFor(model=>model.Name)
27             @Html.ValidationMessageFor(model=>model.Name)
28         </div>
29         <div class="editor-label">
30             @Html.LabelFor(model=>model.Description)
31         </div>
32         <div class="efitor-field">
33             @Html.TextAreaFor(model=>model.Description)
34             @Html.ValidationMessageFor(model=>model.Description)
35         </div>
36         <p>
37             <input type="submit" />
38         </p>
39     </fieldset>
40 }
複製代碼

 效果如圖所示:

經過上面的例子,很容易的實現了關注點分離。

 

6,使用分部視圖

在ASP.NET Web Form的開發經驗中,對於User Control使用比較頻繁,能夠減小重複的代碼{不要重複你本身的原則},利於頁面模塊化,這個概念也被引入了ASP.NET MVC.即「分部視圖」。

分部視圖把部分HTML或邏輯包裝起來,方便重複引用,把分部視圖放置與Views\Shared目錄時,供其餘的View載入。

建立部分視圖與建立普通的視圖的的方式一致,特別的是須要選中「建立分部視圖」複選框,並放在Shared目錄下。默認狀況下分部視圖*.cshtml爲空文檔。

  使用分部視圖時,不須要創建相關的Action。由於分部視圖是片斷的,必需要選擇一個完整的頁面來載入。用@Html.Partial()方法。

  在一個視圖頁面中,若是載入了多個分部視圖,每一個分部視圖都可以取到原頁面的ViewData\TempData\Model等數據,也就是說數據能夠在各分部視圖之間公用。

  分部視圖除了能夠直接從檢視頁面載入外,也能夠像通常檢視頁面同樣從Controller中使用。示例代碼以下:

複製代碼
 1      //控制器中示例代碼  
 2      public ActionResult Test()
 3         {
 4             return PartialView();
 5         }
 6        //而後建立Test的分部視圖,簡單起見只輸入一行文本
 7     
 8      個人博客是SharpL
 9 
10 
11        //最後在視圖頁面中,經過Html.Action載入TestAction的執行結果
12      @Html.Action("Test")
複製代碼

經過Html.Action與Html.Partial載入分部視圖的結果是一致的,可是過程不一樣,Html.Action會從新執行一遍Controller的聲明週期。

 

7,MVC支持兩種不一樣的「視圖模板」:分別是顯示模板和編輯器模板。

  以@Html.EditorFor(m=>m.UserName)來講,@Html.EditorFor模板會依據UserName的類型以及屬性(好比[DataType(DataType.Password)])來找出合適的模板,UserName的數據類型爲String,所以模板名稱也將爲String,MVC 4中內建的編輯器模板中包括String,因此模板輔助方法會挑出String這個視圖模板來執行。由於模板輔助方法在判斷模板名稱時,除了判斷型別名稱外,還會判斷其屬性,以Password來講,最終將會選擇Password模板來執行。

1         [Required]
2         [DataType(DataType.Password)]
3         [Display(Name = "密碼")]
4         public string Password { get; set; }

 MVC4中內建了10個顯示模板,其中包括EmailAddress等。

複製代碼
 1         [Required]
 2         [MaxLength(200)]
 3         [DisplayName("會員電子郵箱")]
 4         [DataType(DataType.EmailAddress)]
 5         public string Email { get; set; }
 6 
 7         /* 注意Email上的DataType屬性 */        
 8   
 9 
10      <div class="display-field">
11         @Html.DisplayFor(m=>m.Email)
12     </div>
複製代碼

EmailAddress將輸出超連接,網頁的HTML源碼碼以下:

1     <div class="display-field">
2         <a href="mailto:SharpL@qq.com">SharpL@qq.com</a>
3     </div>

 

8,自定義視圖模板

  約定以下:

  視圖模板必定要放在指定的幾個規定目錄下{以約定代替配置原則},顯示模板路徑:

/Views/ControllerName/DisplayTemplates或者/Views/Shared/DisplayTemplates目錄下。

編輯器模板位於:

/Views/ControllerName/EditorTemplates或者/Views/Shared/EditorTemplates目錄下。

文檔名稱必須等於類型名稱。文檔的後綴名能夠是.cshtml/.vbhtml/.aspx/.ascx。先插入一段代碼,以下:

1         [NotMapped]
2         [UIHint("Gravatar")]
3         [DisplayName("會員Gravatar照片")]
4         public string Gravatar { get; set; }

[NotMapped]屬性指不須要創建在數據庫中,而UIHint屬性指爲Gravator添加自定義模板,且模板名稱爲」Gravatar「。
因而咱們在/Views/Shared/DisplayTemplates文件夾下新建一個」Gravatar.cshtml"文檔,不須要強類型。將該視圖中的@model定義爲string,是由其上一級視圖傳遞進來的,代碼以下:

1 @model System.String
2 
3 @{
4     var temp = "算你狠" + Model;
5 }
6 <h2>@temp</h2>

效果以下:

 

自定義編輯器模板與自定義顯示模板的方式一致,只是約定的路徑不一樣,示例代碼以下:

複製代碼
 1         [Required]
 2         [UIHint("DateTime")]
 3         [DisplayName("建立會員的日期")]
 4         public DateTime CreateOn { get; set; }
 5 
 6     /*注意是EditorFor,若是是LabelFor無效,由於咱們修改的是編輯器模板
 7     <div class="display-field">
 8         @Html.EditorFor(m=>m.CreateOn)
 9     </div>
10 
11 /*編輯器模板*/
12 @model System.DateTime
13 
14 @Html.TextBox("",Model.ToString("yyyy/MM/dd"))
複製代碼

 

9,選用視圖模板的判斷順序:

UIHint屬性優先級最高,屬於自定義模板,其次是DataType,是字段的屬性,最後是字段的類型。

 

10,@Html.DisplayForModel()

該輔助器方法不用傳入任何參數,每條屬性會挑選出適當的試圖模板來輸出

 

11,自定義Html輔助方法

也就是給HtmlHrlper類添加拓展方法,將方法定義在抽象類的抽象方法中。

複製代碼
 1     public static  class ImageHelpers
 2     {
 3         /// <summary>
 4         /// 實際上就是建立一個HtmlHelper類的拓展方法
 5         /// </summary>
 6         /// <param name="helper">要被拓展的類</param>
 7         /// <param name="url">圖片網址啊</param>
 8         /// <param name="alternateText">說明文字</param>
 9         /// <param name="title">標題文字</param>
10         /// <returns></returns>
11         public static MvcHtmlString Img(this HtmlHelper helper,string url,string alternateText,string title)
12         {
13             return MvcHtmlString.Create(string.Format("<img src='{0}' alt='{1}' title='{2}'/>", url, alternateText, title));
14         }
15     }
複製代碼

能夠以StringBuilder組字串的方式,來寫Html標籤,也能夠用TagBuilder來寫,不作詳細的說明,能夠參考ASP.NET MVC4開發指南中7.4.5章節的介紹。

12,Url輔助方法

@url.Action("ActionName")  最後輸出結果爲 /ControllerName/ActionName

同時@url.RouteUrl(new {name="SharpL"})

還有@Url.Encode("str")等等。

@Url.Content("~/images/Logo.png") 取得網站中靜態文檔的網址路徑。

 

 

出處:http://www.cnblogs.com/SharpL/p/4596044.html

相關文章
相關標籤/搜索