在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、表单(一)Action和Method特性 Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址。这里的Url地址可以是相对的,也可以是绝对的。如下Form标签向Bing的search页面发送一个搜索词(输入元素的名称为q)。 <form action="http://www.bing.com/search"> <input name="q" type="text" /> <input type="submit" value="search" /> </form> Method特性可以告知浏览器使用HTTP POST还是使用HTTP GET,默认情况下表单发送的是HTTP GET请求。下面,我们分别介绍GET方法和POST方法。 (二)GET方法 - 从指定的资源请求数据
(三)POST方法 - 向指定的资源提交要被处理的数据
二、HTML辅助方法Html属性调用HTML辅助方法,Url属性调用URL辅助方法,Ajax属性调用Ajax辅助方法。 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 @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 @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操作: 1 public ActionResult Edit(int id) 2 { 3 var album = storeDB.Albums.Single(a => a.AlbumId == id); 4 ViewBag.Genres = new SelectList(storeDB.Genres.OrderBy(g => g.Name), "GenreId","Name",album.GenreId); 5 return View(album); 6 } 这里控制器操作不仅构建了主要模型(用于编辑的模型),还构建了下拉列表辅助方法所需要的表示模型。SelectList构造函数的参数指定了原始集合(数据库中的Genres表)、作为后台值使用属性名称(Name)以及当前所选项的值(他决定将哪一项标记为选择项)。如果想在避免反射开销的同时还想自己生成SelectListItem集合,可以使用LINQ的Select方法来将SelectListItem对象集放入项目Genres: 1 var album = MusicStoreDB.Genres 2 .OrderBy(g => g.Name) 3 .AsEnumerable() 4 .Select(g => new SelectListItem 5 { 6 Text = g.Name, 7 Value = g.GenreId.ToString(), 8 Selected = album.GenreId == g.GenreId 9 }); 10 return View(album); 7.Html.ValidationMessage 1 @Html.ValidationMessage("Title") 等效HTML: 1 <span class="field-validation-error" data-valmsg-for="Title" data-valmsg-replace="true"> 2 What a terrible name! 3 </span> 当ModelState字典中的某一特定字段出现错误时,可以使用ValidationMessage辅助方法来显示相应的错误提示消息。 8.Html.Hidden 1 @Html.Hidden("WizardStep","1") 方法用于渲染隐藏的输入元素,等效HTML: <input id="wizardStep" name="wizardStep" type="hidden" value="1" /> 强类型方法是Html.HiddenFor。如果模型有一个WizardStep属性,就可以这样使用: @Html.HiddenFor(m => m.WizardStep) 9.Html.Password 1 @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 1 @Html.RadioButton("color","red") 单选按钮一般都组合一起使用,为用户的单项选择提供一组可选项。等效的HTML: <input id="color" name="color" type="radio" value="red" /> Html.RadioButton有一个强类型的对应方法Html.RadioButtonFor。强类型方法不使用名称和值,而是用表达式来标识那些包含有要渲染属性的对象,当用户选择单选按钮时,后面会跟要提交的值: @Html.RadioButtonFor(m => m.GenreId, "1") Rock 11.Html.CheckBox @Html.CheckBox("IsDiscounted") 方法是唯一一个渲染两个输入元素的辅助方法,等效HTML: 1 <input id="IsDiscounted" name="IsDiscounted" type="checkbox" value="true" /> 三、辅助方法、模型和视图数据辅助方法如Html.TextBox和Html.DropDownList(以及其他所有表单辅助方法)检查ViewData对象以获得要显示的当前值(在ViewBag对象中的所有值也可以通过ViewData得到)。 (1)如果想在一个表单中设置专辑的价格,可使用下面的控制器代码 1 public ActionResult Edit(int id) 在相应的视图中,使用ViewBag中的值来为TextBox辅助方法命名,可以实现渲染显示价格的文本框: @Html.TextBox("Price") TextBox辅助方法将生成如下所示的HTML标记: <input id="Price" name="Price" type="text" value="10" /> (2)当辅助方法查看ViewData里面的内容时,他们也能看到其中的对象属性。修改先前的控制器操作: public ActionResult Edit(int id) 2 { 3 ViewBag.Album = new Album {Price = 11}; 4 return View(); 5 } 在响应的视图中,可以使用下面这行代码来显示一个带有专辑价格的文本框: @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辅助方法依靠强类型视图数据也能很好的工作。 1 public ActionResult Edit(int id) 2 { 3 var album = new Album {Price = 12.0m}; 4 return View(album); 5 } 视图中的代码: @Html.TextBox("Price"); 对应的HTML标记: <input id="Price" name="Price" type="text" value="12.0" /> (4)如果想避免自动的查找数据,可向表单辅助方法提供一个显式的值。有时,显式提供值的方法是必须的。返回到刚才正在构建(用来编辑专辑信息)的表单。控制器代码: 1 public ActionResult Edit(int id)
2 {
3 var album = storeDB.Albums.Single(a => a.AlbumId == id);
4 5 ViewBag.Genres = new SelectList(storeDB.Genres.OrderBy(g => g.Name)
6 , "GenreId"
7 , "Name"
8 , album.GenreId);
9 return View(album);
11 }
视图: @Html.TextBox("Title", Model.Title) 四、强类型的辅助方法如果不适应使用字符串字面值从视图数据中提取值的话,也可以使用MVC提供的各种强类型辅助方法。使用强类型辅助方法时,只需要为其传递一个lambda表达式来指定要渲染的模型属性。表达式的模型类型必须和为视图指定的模型类型(使用@model指令)一致。对于专辑模型的强类型视图,需要在视图顶部输入如下所示的代码 @model MvcMusicStore.Models.Album 一旦添加模型指令,就可以使用下面的代码重写前面的专辑编辑表单 1 @using (Html.BeginForm()) 2 { 3 @Html.ValidationSummary(excludePropertyErrors: true) 4 <fieldset> 5 <legend>Edit Album</legend> 6 <p> 7 @Html.LabelFor(m => m.GenreId) 8 @Html.DropDownListFor(m => m.GenreId, ViewBag.Genres SelectList) 9 </p> 10 <p> 11 @Html.TextBoxFor(m => m.Title) 12 @Html.ValidationMessageFor(m => m.Title) 13 </p> 1 14 <input type="submit" name="Save"> 15 </fieldset>> 16 } 注意:
五、模版辅助方法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。当链接的操作所在控制器与用来渲染当前视图的控制器一样时,只需要指定操作的名称: 1 @Html.ActionLink("Link Text", "AnotherAction") 这里假设采用默认路由,那么执行这段代码将生成如下所示的HTML标记 <a href = "/Home/AnotherAction">LinkText</a> 13 URL辅助方法 URL辅助方法与HTML的ActionLink和RouteLink辅助方法类似,但它不是以HTML标记的形式返回构建的URL,而是以字符串的形式返回这些URL。对此,有三个辅助方法:Action、Content、RouteUrlAction辅助方法与ActionLink非常类似,但是它不返回锚标签。例如,下面的代码会显示浏览商店里所有Jazz专辑的URL(不是链接) 1 <span> 2 @Url.Action("Browse", "Store", new {genre = "Jazz"}, null) 3 </span> 将会生成如下所示的HTML标记 1 <span> 2 /Store/Browse?genre=Jazz 3 </span> 14 Html.Partial和Html.RenderPartial Partial辅助方法用于将部分视图渲染成字符串,如下将渲染一个名为AlbumDisplay的部分视图 @Html.Partial("AlbumDisplay") RenderPartial辅助方法与Partial非常相似,但RenderPartial不是返回字符串,而是直接写入响应输出流。基于这个原因,必须将RenderPartial放入代码块中,而不能放在代码表达式 1 @{Html.RenderPartial("AlbumDisplay"); } 2 或 3 @Html.Partial("AlbumDisplay") 一般情况下,因为Partial相对于RenderPartial来说更方便(不必使用花括号将调用封装在代码块中),所以选择Partial。然而,RenderPartial拥有较好的性能,因为它是直接写入响应流的,但这种性能优势需要大量的使用(高的网站流量或在循环中重复调用)才能看出来。 15 Html.Action和Html.RenderAction Action和RenderAction之间仅有的不同之处在于:RenderAction可以直接写入响应流。 |
请发表评论