知识点3-5:使用强类型模板
当你开始使用一个基于表现式模型的强类型视图时,会看到越来越多的样式(如文本框、单选按钮、复选框、密码字段等)。
- 模型类中的布尔型属性,几乎可以肯定你会希望它显示成表单上的一个复选框。
- 模型类中的电子邮件型属性、密码属性等,都有特定的显示要求。
- 输入元素不包括相应的验证消息是罕见的。
ASP.NET MVC为我们提供了一种基于模型元数据进行渲染决策的方式,根据视图模型属性来生成HTML片段。如RequiredAttribute来标记视图模型,自动验证必填字段。
通常为了在视图中显示信息,可能会使用HtmlHelper(HTML辅助器)对象,以协助获取视图模型来生成HTML。例如LoginModel清单如下。
public class LoginModel { [Required] [Display(Name = "用户名")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "密码")] public string Password { get; set; } [Display(Name = "记住我?")] public bool RememberMe { get; set; } }
登录屏幕显示了每个属性的输入元素,如下图所示。
@model Guestbook.Models.LoginModel @{ ViewBag.Title = "登录"; } <hgroup class="title"> <h1>@ViewBag.Title.</h1> </hgroup> <section id="loginForm"> <h2>使用本地帐户登录。</h2> @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) <fieldset> <legend>“登录”表单</legend> <ol> <li> @Html.LabelFor(m => m.UserName) @Html.TextBoxFor(m => m.UserName) @Html.ValidationMessageFor(m => m.UserName) </li> <li> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) @Html.ValidationMessageFor(m => m.Password) </li> <li> @Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" }) </li> </ol> <input type="submit" value="登录" /> </fieldset> <p> @Html.ActionLink("注册", "Register") 如果你没有帐户。 </p> } </section>
在上述清单中,我们利用了几个专为强类型视图页面设计的HtmlHelper扩展方法,包括标签方法LabelFor、输入文本框TextBoxFor、验证消息ValidationMessageFor。而不是松散类型的字符串来表示属性,@Html.TextBox("UserName")。
Html.LabelFor和Html.TextBoxFor方法生成的HTML,如清单3.8所示。
<label for="UserName">User name</label> <input id="UserName" name="UserName" type="text" value="" />
使用强类型视图页面的HtmHelper扩展方法,页面有良好的可用性,不需担心硬编码的标签和输入元素名称。
HTML辅助器 | 描述 |
DisplayFor | 用字符串显示属性的值 |
DisplayTextFor | 用字符串显示属性的值,不可编辑 |
DisplayNameFor | 显示字段名字 |
EditorFor | 根据属性的不同性质生成相应的HTML可编辑标记。例如,若为文本属性,则显示输入本文框;若为布尔属性,则显示单选框等。 |
CheckBoxFor | 返回复选框标记 |
DropDownListFor | 返回下拉列表标记 |
HiddenFor | 返回隐藏输入标记 |
LabelFor | 返回标签标记 |
ListBoxFor | 返回列表标记 |
PasswordFor | 返回密码文本框标记 |
RadioButtonFor | 返回单选按钮标记 |
TextAreaFor | 返回多行录入的文本框 |
TextBoxFor | 返回文本框标记 |
ValidateFor | 接受验证元数据,并对表达式属性的数据字段进行验证 |
ValidationMessageFor | 返回验证错误消息标记 |