[ASP.NET MVC] @Html.DisplayFor() 、@Html.DisplayTextFor()、@Html.DisplayNameFor() 和 @Html.EditorFor()
使用過 ASP.NET MVC 內建產生範本功能的人一定對標題的四個方法不陌生,如下有一 Model UserInfo 這樣設計:
Model 各屬性的資料型態
using System.ComponentModel; namespace prjMVC.Models { public class UserInfo { [DisplayName("姓名")] public string Name { get; set; } [DisplayName("年齡")] public int Age { get; set; } [DisplayName("體重")] public double Weight { get; set; } [DisplayName("生日")] public DateTime Birthday { get; set; } [DisplayName("已婚")] public bool IsMarried { get; set; } } }
在 Controller 傳到 View:
UserInfo user = new UserInfo { Name = "Billy", Age = 25, Weight = 74.5, Birthday = new DateTime(1997, 5, 2), IsMarried = true, }; return View(user);
DisplayFor() 方法
在 View 中,@Html.DisplayFor() 會依據資料和型態來顯示:
@model prjMvc.Models.UserInfo <h2>DisplayFor</h2> <div>@Html.DisplayFor(m => m.Name)</div> <div>@Html.DisplayFor(m => m.Age)</div> <div>@Html.DisplayFor(m => m.Weight)</div> <div>@Html.DisplayFor(m => m.Birthday)</div> <div>@Html.DisplayFor(m => m.IsMarried)</div> //會產生: <h2>DisplayFor</h2> <div>Billy</div> <div>25</div> <div>74.5</div> <div>1997/5/2 上午 12:00:00</div> <div><input checked="checked" class="check-box" disabled="disabled" type="checkbox" /></div>
如上所示,@Html.DisplayFor() 會依據資料和型態產生恰當的顯示控制項,例如 bool 布林值會產生 disabled 的 <input type="checkbox"> 顯示該數值。
DisplayTextFor() 方法
在 View 中,@Html.DisplayTextFor() 會顯示資料的字串結果:
@model prjMvc.Models.UserInfo <h2>DisplayTextFor</h2> <div>@Html.DisplayTextFor(m => m.Name)</div> <div>@Html.DisplayTextFor(m => m.Age)</div> <div>@Html.DisplayTextFor(m => m.Weight)</div> <div>@Html.DisplayTextFor(m => m.Birthday)</div> <div>@Html.DisplayTextFor(m => m.IsMarried)</div> // 會產生: <h2>DisplayTextFor</h2> <div>Billy</div> <div>25</div> <div>74.5</div> <div>1997/5/2 上午 12:00:00</div> <div>True</div>
如上所示,@Html.DisplayTextFor() 只會顯示純字串,適合放在 <table> 中的 <tbody> 中顯示每一筆資料的數值。
DisplayNameFor() 方法
在 View 中,@Html.DisplayNameFor() 會顯示在類別中用 Annotation 寫的 [DisplayName()] 數值:
@model prjMvc.Models.UserInfo <h2>DisplayNameFor</h2> <div>@Html.DisplayNameFor(m => m.Name)</div> <div>@Html.DisplayNameFor(m => m.Age)</div> <div>@Html.DisplayNameFor(m => m.Weight)</div> <div>@Html.DisplayNameFor(m => m.Birthday)</div> <div>@Html.DisplayNameFor(m => m.IsMarried)</div> // 會產生: <h2>DisplayNameFor</h2> <div>姓名</div> <div>年齡</div> <div>體重</div> <div>生日</div> <div>已婚</div>
如上所示,@Html.DisplayNameFor() 顯示此屬性設定的名字例如「姓名」,沒有掛 Annotation 設定的話會顯示原來的屬性名例如「Name」,適合放在 <table> 中的 <thead> 或 <th> 當作標頭。類似 DisplayNameFor() 的是 LabelFor(),差別在後者產生的 <label> 標籤在點選時會 focus 到 for-id 對應的控制項,而前者只有字串。
EditorFor() 方法
在 View 中,@Html.EditorFor() 會依據資料與型態產生恰當的修改用控制項:
@model prjMvc.Models.UserInfo <h2>EditorFor</h2> <div>@Html.EditorFor(m => m.Name)</div> <div>@Html.EditorFor(m => m.Age)</div> <div>@Html.EditorFor(m => m.Weight)</div> <div>@Html.EditorFor(m => m.Birthday)</div> <div>@Html.EditorFor(m => m.IsMarried)</div> // 會產生: <h2>EditorFor</h2> <div><input class="text-box single-line" id="Name" name="Name" type="text" value="Billy" /></div> <div><input class="text-box single-line" data-val="true" data-val-number="欄位 年齡 必須是數字。" data-val-required="年齡 欄位是必要項。" id="Age" name="Age" type="number" value="25" /></div> <div><input class="text-box single-line" data-val="true" data-val-number="欄位 體重 必須是數字。" data-val-required="體重 欄位是必要項。" id="Weight" name="Weight" type="text" value="74.5" /></div> <div><input class="text-box single-line" data-val="true" data-val-date="欄位 生日 必須是日期。" data-val-required="生日 欄位是必要項。" id="Birthday" name="Birthday" type="datetime" value="1997/5/2 上午 12:00:00" /></div> <div><input checked="checked" class="check-box" data-val="true" data-val-required="已婚 欄位是必要項。" id="IsMarried" name="IsMarried" type="checkbox" value="true" /> <input name="IsMarried" type="hidden" value="false" /> </div>
如上所示,@Html.EditorFor() 會依據資料與型態用適合的控制項讓使用者修改,例如 int 整數會提供 <input type="number"> 。
additionalViewData 和 htmlAttributes
前面介紹產生控制項的方法,例如 TextBox()、TextBoxFor()、LabelFor()、CheckBox() … 都有一個 overload 是有 object htmlAttributes 引數的,直接在該位置使用匿名類別 new { } 即可,例如:
@Html.Label("ListPrice": , "定價:" , new { @class = "label-title" } ) @Html.TextBox("ListPrice" , "720" , new { type = "number" } )
可直接產生對應 key value 的 HTML 標籤的屬性。但是上面的 DisplayFor() 和 EditorFor() 並沒有引數是 htmlAttributes 的,而是 object additionViewData,這個和 template 有關在此不贅述,只講帶入 HTML 屬性的方法:
@Html.EditorFor(m => m.Name , new { htmlAttributes = new { maxLength = "15" , required = "true" } } ) @Html.EditorFor(m => m.Birthday , new { htmlAttributes = new { type = "date" } } )
如上所示,匿名類別裡的匿名類別,additionalViewData 中有個 key 為 htmlAttributes,用 new { } 給他 value 即可。
- @Html.ActionLink() 和 <a>
- @Html.TextBox() 、@Html.TextBoxFor() 和 <input type="text">
- @Html.TextArea() 、@Html.TextAreaFor() 和 <textarea>
- @Html.Label() 、@Html.LabelFor() 和 <label>
- @Html.Password() 、@Html.PasswordFor() 和 <input type="password">
- @Html.RadioButton() 、@Html.RadioButtonFor() 和 <input type="radio">
- @Html.CheckBox() 、@HtmlCheckBoxFor() 和 <input type="checkbox">
- @Html.DropDownList() 、@Html.DropDownListFor() 和 <select> 與<option>
- @Html.BeginForm() 和 <form>
- @Html.Hidden() 、@Html.HiddenFor() 和 <input type="hidden">
- @Html.DisplayFor() 、@Html.DisplayTextFor()、@Html.DisplayNameFor() 和 @Html.EditorFor()
留言
張貼留言