[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()




留言
張貼留言