ASP.NET MVC5高级编程 之 HTML辅助方法
Html属性调用HTML辅助方法,Url属性调用URL辅助方法,Ajax属性调用Ajax辅助方法。
HTML辅助方法
1.Html.BeginForm
@using (Html.BeginForm("Search", " Home", FormMethod.Get)) { <input type="text" name="q" /> <input type="submit" name="Search" /> }
等效的html:
<form action="/Home/Search" method="get">
设置元素的class特性就要求匿名类型对象上必须有一个名为class的属性,或者值的字典中有一个名为class的键。在字典中有一个“class”的键值不是问题,问题在于对象中带有一个名为class的属性。因为class是c#语言的保留关键字,不能用作属性名称或标识符,所以必须在class前面加一个@符号作为前缀:
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new {target = "_blank", @class="editForm"}))
另一个问题是将属性设置为带有连字符的名称(项data-val)。带有连字符的C#属性名是无效的,但所有的HTML辅助方法在渲染HTML时会将属性名中的下划线转换为连字符。
@using (Html.BeginForm("Search", "Home", FormMethod.Get, new {target = "_blank",@class="editForm", data_validatable=true}))
等效的HTML为:
<form action="/Home/Search" class="editForm" data-validatable="true" method="get" target="_blank">
2.Html.ValidationSummary
@Html.ValidationSummary(true)
用来显示ModelState字典中所有验证错误的无序列表。使用布尔类型参数(值为true)来告知辅助方法排除属性级别的错误,而不显示那些具体模型属性相关的错误
3.Html.TextBox
1 @Html.TextBox("Title",Model.Title)
渲染一个type特性为text的input标签,用于接收用户自由形式的输入,等效的HTML:
<input id="Title" name="Title" type="text" value="For those about to Rock We Salute You" />
4.Html.TextArea
1 @Html.TextArea("text","hello <br/> world")
等效HTML:
<textarea cols="80" id="text" name="text" rows="10">hello <br /> world </textarea>
5.Html.Label
@Html.LabelFor("GenereId")
等效HTML:
<label for ="GenreId">Genre</label>
返回一个<label/>元素,并使用String类型的参数来决定渲染的文本和for特性值
6.Html.DropDownList和Html.ListBox
DropDownList允许进行单项选择,而ListBox支持多项选择(在要渲染的标记中,把multiple特性的值设置为multiple)
通常,select元素有两个作用:
- 展示可选项的列表
- 展示字段的当前值
下拉列表需要包含所有可选项的SelectListItem对象集合,其中每一个SelectListItem对象又包含有Text、Value和Selected三个属性。可以根据需要构建自己的SelectListItem对象集合,也可以使用框架中的SelectList或者MultiSelectList辅助方法类来构建。这些类可以查看任意类型的Ienumerable对象并将其转换为SelectListItem对象的序列。
例如,StoreManager控制器中的Edit操作:
public ActionResult Edit(int id) { var album = storeDB.Albums.Single(a => a.AlbumId == id); ViewBag.Genres = new SelectList(storeDB.Genres.OrderBy(g => g.Name), "GenreId","Name",album.GenreId); return View(album); }
这里控制器操作不仅构建了主要模型(用于编辑的模型),还构建了下拉列表辅助方法所需要的表示模型。SelectList构造函数的参数指定了原始集合(数据库中的Genres表)、作为后台值使用属性名称(Name)以及当前所选项的值(他决定将哪一项标记为选择项)。
如果想在避免反射开销的同时还想自己生成SelectListItem集合,可以使用LINQ的Select方法来将SelectListItem对象集放入项目Genres:
var album = MusicStoreDB.Genres .OrderBy(g => g.Name) .AsEnumerable() .Select(g => new SelectListItem { Text = g.Name, Value = g.GenreId.ToString(), Selected = album.GenreId == g.GenreId }); return View(album);
7.Html.ValidationMessage
@Html.ValidationMessage("Title")
等效HTML:
<span class="field-validation-error" data-valmsg-for="Title" data-valmsg-replace="true"> What a terrible name! </span>
当ModelState字典中的某一特定字段出现错误时,可以使用ValidationMessage辅助方法来显示相应的错误提示消息。
8.Html.Hidden
@Html.Hidden(")
方法用于渲染隐藏的输入元素,等效HTML:
<input id="wizardStep" name="wizardStep" type="hidden" value="1" />
强类型方法是Html.HiddenFor。如果模型有一个WizardStep属性,就可以这样使用:
@Html.HiddenFor(m => m.WizardStep)
9.Html.Password
@Html.Password("UserPassword")
方法用于渲染密码字段。它除了不保留提交值,显示密码掩码之外,基本与TextBox辅助方法一样。
等效HTML:
<input id="UserPassword" name="UserPassword" type="password" value="">
Html.Password的强类型方法是Html.PasswordFor。下面的代码展示如何使用它来显示UserPassword属性:
@Html.PasswordFor(m => m.UserPassword)
10.Html.RadioButton
@Html.RadioButton("color","red")
单选按钮一般都组合一起使用,为用户的单项选择提供一组可选项。
等效的HTML:
<input id="color" name="color" type="radio" value="red" />
Html.RadioButton有一个强类型的对应方法Html.RadioButtonFor。强类型方法不使用名称和值,而是用表达式来标识那些包含有要渲染属性的对象,当用户选择单选按钮时,后面会跟要提交的值:
@Html.RadioButtonFor(m => m.GenreId, ") Rock
11.Html.CheckBox
@Html.CheckBox("IsDiscounted")
方法是唯一一个渲染两个输入元素的辅助方法,等效HTML:
<input id="IsDiscounted" name="IsDiscounted" type="checkbox" value="true" /> <input name="IsDiscounted" type="hidden" value="false" />
辅助方法、模型和视图数据:
辅助方法如Html.TextBox和Html.DropDownList(以及其他所有表单辅助方法)检查ViewData对象以获得要显示的当前值(在ViewBag对象中的所有值也可以通过ViewData得到)。
(1)如果想在一个表单中设置专辑的价格,可使用下面的控制器代码
public ActionResult Edit(int id) { ViewBag.Price = 10.0; return View(); }
在相应的视图中,使用ViewBag中的值来为TextBox辅助方法命名,可以实现渲染显示价格的文本框:
@Html.TextBox("Price")
TextBox辅助方法将生成如下所示的HTML标记:
<input id=" />
(2)当辅助方法查看ViewData里面的内容时,他们也能看到其中的对象属性。修改先前的控制器操作:
public ActionResult Edit(int id) { ViewBag.Album = }; return View(); }
在响应的视图中,可以使用下面这行代码来显示一个带有专辑价格的文本框:
@Html.TextBox("Album.Price")
现在渲染出的HTML标记如下所示:
<input id="Album_Price" name="Album.Price" type="text" value="11" />
如果在ViewData中没有匹配“Album.Price”的值,那么辅助方法将尝试查找与第一个点之前那部分名称(Album)匹配的值。换言之,就是找一个Album类型的对象。然后,辅助方法估测名称中剩余的部分(Price),并找到相应的值。
注意渲染得到的input元素的id特性值使用下划线代替了点(但name特性依然使用点)。
(3)TextBox辅助方法依靠强类型视图数据也能很好的工作。
public ActionResult Edit(int id) { var album = new Album {Price = 12.0m}; return View(album); }
视图中的代码:
@Html.TextBox("Price");
对应的HTML标记:
<input id="Price" name="Price" type="text" value="12.0" />
(4)如果想避免自动的查找数据,可向表单辅助方法提供一个显式的值。有时,显式提供值的方法是必须的。返回到刚才正在构建(用来编辑专辑信息)的表单。
控制器代码:
public ActionResult Edit(int id) { var album = storeDB.Albums.Single(a => a.AlbumId == id); ViewBag.Genres = new SelectList(storeDB.Genres.OrderBy(g => g.Name) , "GenreId" , "Name" , album.GenreId); return View(album); }
视图:
@Html.TextBox("Title", Model.Title)
强类型的辅助方法
如果不适应使用字符串字面值从视图数据中提取值的话,也可以使用MVC提供的各种强类型辅助方法。使用强类型辅助方法时,只需要为其传递一个lambda表达式来指定要渲染的模型属性。表达式的模型类型必须和为视图指定的模型类型(使用@model指令)一致。对于专辑模型的强类型视图,需要在视图顶部输入如下所示的代码:
@model MvcMusicStore.Models.Album
一旦添加模型指令,就可以使用下面的代码重写前面的专辑编辑表单:
@using (Html.BeginForm()) { @Html.ValidationSummary(excludePropertyErrors: true) <fieldset> <legend>Edit Album</legend> <p> @Html.LabelFor(m => m.GenreId) @Html.DropDownListFor(m => m.GenreId, ViewBag.Genres SelectList) </p> <p> @Html.TextBoxFor(m => m.Title) @Html.ValidationMessageFor(m => m.Title) </p> <input type="submit" name="Save"> </fieldset>> }
注意:
- 这些强类型的辅助方法名称除了有"For"后缀之外,跟先前使用的辅助方法还有相同的名称。尽管该代码生成了与先前代码同样的HTML标记,但是用lambda表达式代替字符串还有许多其他好处,其中包括智能感知、编译时检查和轻松的代码重构。
- 这里不需要显式的为Title文本框设置值,这主要是因为lambda表达式向辅助方法提供了足够的信息,使其能直接读取模型的Title属性来获取需要的值。
模版辅助方法
ASP.NET MVC中的模版辅助方法利用元数据和模版构建HTML。其中元数据包括关于模型值(它的名称和类型)的信息和(通过数据注解或自定义提供器添加的)模型元数据
。模型辅助方法有Html.Display和Html.Editor,以及分别与他们对应的强类型方法Html.DisplayFor和Html.EditorFor,还有它们对应的完整模型Html.DisplayForModel和Html.EditorForModel。
@Html.TextBox("Title",Model.Title)
等同于:
@Html.EditorFor(m => m.Title)
两者生成的HTML标记是相同的,,但是EditorFor方法可以通过使用数据注解来改变生成的HTML
渲染辅助方法
12.Html.ActionLink和Html.RouteLink
ActionLink辅助方法能渲染一个超链接(锚标签),渲染的链接指向另一个控制器操作,与前面看到的BeginForm辅助方法一样,ActionLink辅助方法在后台使用路由API来生成URL。
- 当链接的操作所在控制器与用来渲染当前视图的控制器一样时,只需要指定操作的名称:
@Html.ActionLink("Link Text", "AnotherAction")
这里假设采用默认路由,那么执行这段代码将生成如下所示的HTML标记:
<a href = "/Home/AnotherAction">LinkText</a>
当需要一个指向不同控制器操作的链接时,可通过ActionLink方法的第三个参数来指定控制器名称。例如要链接到ShoppingCartController控制器的Index操作,可以使用下面的代码:
@Html.ActionLink("Link Text", "Index", "ShoppingCart")
13 URL辅助方法
URL辅助方法与HTML的ActionLink和RouteLink辅助方法类似,但它不是以HTML标记的形式返回构建的URL,而是以字符串的形式返回这些URL。对此,有三个辅助方法:
- Action
- Content
- RouteUrl
Action辅助方法与ActionLink非常类似,但是它不返回锚标签。例如,下面的代码会显示浏览商店里所有Jazz专辑的URL(不是链接):
<span> @Url.Action("Browse", "Store", new {genre = "Jazz"}, null) </span>
将会生成如下所示的HTML标记:
<span> /Store/Browse?genre=Jazz </span>
14 Html.Partial和Html.RenderPartial
Partial辅助方法用于将部分视图渲染成字符串,如下将渲染一个名为AlbumDisplay的部分视图
@Html.Partial("AlbumDisplay")
RenderPartial辅助方法与Partial非常相似,但RenderPartial不是返回字符串,而是直接写入响应输出流。基于这个原因,必须将RenderPartial放入代码块中,而不能放在代码表达式。
@{Html.RenderPartial("AlbumDisplay"); } 或 @Html.Partial("AlbumDisplay")
一般情况下,因为Partial相对于RenderPartial来说更方便(不必使用花括号将调用封装在代码块中),所以选择Partial。然而,RenderPartial拥有较好的性能,因为它是直接写入响应流的,但这种性能优势需要大量的使用(高的网站流量或在循环中重复调用)才能看出来。
15 Html.Action和Html.RenderAction
Action和RenderAction之间仅有的不同之处在于:RenderAction可以直接写入响应流。
ASP.NET MVC5高级编程 之 HTML辅助方法的更多相关文章
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- ASP.NET MVC5 高级编程 第3章 视图
参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...
- ASP.NET MVC5 高级编程 第2章 控制器
参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...
- ASP.NET MVC5高级编程 之 Ajax
jQuery不仅支持所有现代浏览器,包括IE.Firefox.Safari.Opera和Chrome等,还可以在编写代码和浏览器API冲突时隐藏不一致性(和错误). 1. jQuery jQuery擅 ...
- ASP.NET MVC5高级编程 之 模型
1. 为MVC Music Store建模 Models文件夹(右击) --> 添加 --> 类 为类添加对应的属性: public class Album { public virtua ...
- ASP.NET MVC5 高级编程-学习日记-第一章 入门
1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. 1.1.1 MVC模式 ...
- ASP.NET MVC5高级编程 之 数据注解和验证
客户端验证逻辑会对用户向表单输入的数据给出一个即时反馈.而之所以需要服务器端验证,是因为来自网络的信息都是不能被信任的. 当在ASP.NET MVC设计模式上下文中谈论验证时,主要关注的是验证模型的值 ...
- 学习《ASP.NET MVC5高级编程》——基架
基架--代码生成的模板.我姑且这么去定义它,在我学习微软向编程之前从未听说过,比如php代码,大部分情况下是我用vim去手写而成,重复使用的代码需要复制粘贴,即使后来我在使用eclipse这样的IDE ...
- ASP.NET MVC5高级编程 之 视图
1.1理解视图约定 当创建一个项目模版时,可以注意到,项目以一种非常具体的方式包含了一个结构化的Views目录.在每一个控制器的View文件夹中,每一个操作方法都有一个同名的视图文件与其对应.这就提供 ...
随机推荐
- [Android] Android利用Coordinatorlayout+AppbarLayout实现折叠式布局
折叠式布局在App中相当常见,给人一种科技感,充满良好的用户体验. 本文就以两个简单的例子,来举例说明基本折叠式布局: 首先需要在app/build.gradle下添加如下依赖: compile 'c ...
- 错误记录:vue跟vue编译器版本不一致
错误如下: error in ./src/Utils.vue Module build failed: Error: Vue packages version mismatch: - vue@ - v ...
- sql parser
最近在整理很多SQL代码, 需要分析出每个SQL的目标表和源表各有哪些, 网上没有找到工作具, 打算写个工具. Java调研结果:1. 商业组件包 sqlparser 有试用版组件, 限制SQL少于1 ...
- jqgrid again
之前有提及过jqgrid这个很不错的jquery grid, 非常适合企业MIS系统使用. 本文以一个显示学生成绩结果的页面, 来说明它的一些用法, 手写代码, 运行可能会报错, 不过思路是经过验证的 ...
- IT这条路,适合什么人走。
今天 ,到图书馆Study,呼,不知道为撒,看到那么多新书,那么多新技术(也不能说是新技术,就是自己没有学习过的技术),特别兴奋,学习的疲劳顿时间就没了,感觉什么都想学,都想据为己有,但是...... ...
- 如何解决无法成功git commit 和git push
如何解决无法成功git commit 和git push 20155324王鸣宇.20155314刘子健 git add . 成功了 但是git commit无法实现. 我先尝试了卸载git 重新下载 ...
- [C++]Knights of a Polygonal Table(骑士的多角桌)
[程序结果:用例未完全通过,本博文仅为暂存代码之目的] /* B. Knights of a Polygonal Table url:http://codeforces.com/problemset/ ...
- spring cloud心跳检测自我保护(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.)
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER ...
- centos7 安装.net core的方法
安装: sudo yum install libunwind libicu curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?li ...
- 【blog】批量删除时,guava Splitter与Java String的split 方法有什么区别
参考链接 http://www.cnblogs.com/hxfirefox/p/4832913.html