ASP.NET MVC3学习心得-----表单和HTML辅助方法
5.1表单的使用
5.1.1 action和method的特性
表单是包含输入元素的容器,包含按钮、复选框、文本框等元素,表单的这些输入元素使得用户能够向页面中输入信息,并把输入信息提交给服务器。Action特性告知浏览器将URL提交到哪里,method特性来说明用何种方式告知浏览器,默认为get方法
5.1.2Get和Post方法
1、如果不想让浏览器把输入值放入查询字符串中,而是想放入HTTP请求的主体中,可以为method赋值post,post可以用来提交信用卡信息、向购物车添加专辑或者修改密码等,post请求通常会改变服务器上的状态,重复提交等。POST请求用于写操作
2、Get请求所有的参数都在URL中,代表的是幂等操作和只读操作,不会改变服务器的状态,可以向客户端重复的发送GET请求而不会产生负面影响,GET请求用于读操作
示例:通过计算Action特性值来搜索音乐,使用HTML辅助方法代劳如下:
@using(Html.BeginForm("Search","StoreManager",FormMethod.Get)){
<input type="text" name="q"/>
<input type="submit" value="Search"/>
}
5.2HTML辅助方法
HTML辅助方法可以通过视图的Html属性调用的方法。当然也可以通过Url的属性调用URL辅助方法,通过Ajax属性调用AJAX辅助方法,所有的这些方法目的就是为了让视图编码变得容易。
如上边提到的Html.BeginForm()方法,在后台该辅助方法与路由引擎协调以生成合适的URL。该辅助方法在调用期间生成一个起始标签,并返回了一个IDisposable对象,当执行到using语句的结束花括号时,隐式的调用Dispose方法,因此该辅助方法会生成一个结束标签。
5.2.1 自动编码
例:TextArea辅助方法,用来输出HTML元素textarea
@Html.TextArea("text","hello<br/>world!");
5.2.2 辅助方法的使用
BeginForm的另一个重载版本
@using (Html.BeginForm("Search","StoreManager",FormMethod.Get,new{ target="_blank"}))
{
<input type="text" name="q"/>
<input type="submit" value="Search"/>
}
该重载代码向BeginForm方法的htmlAttributes参数传递了一个匿名类对象,在ASP.NET MVC 框架中每一个HTML辅助方法在它某个重载方法中都有一个htmlAttributes参数,不同的版本中htmlAttributes的参数类型是IDictionary<string ,object>辅助方法采用字典条目并利用这些条目创建辅助方法生成元素特性
通过使用htmlAttributes参数设置许多必要的特性,如设置一个元素的class属性,因为class为C#关键字这时需要在class前加@,即@class。
此外将属性设为带有连字符的名称(如:data-val),但是带有连字符的C#属性名是无效的,所有辅助方法在渲染HTML时会将属性名中的下划线转换为连字符。
示例如下:
@using (Html.BeginForm("Search", "StoreManager", FormMethod.Get, new
{
target = "blank",
@class = "green",
data_validatable = true
}))
{
<input type="text" name="q" />
<input type="submit" value="Search" />
}
5.2.3 HTML辅助方法的工作原理
每个Razor视图都继承了各自基类的Html的属性,Html属性的类型是System.web.mvc.HtmlHelper<T>这里的T是一个泛型参数,代表传递给视图的模型类型,该属性提供了一些可以在视图中调用的方法,如:EnableClientValidation(选择性的关闭(打开)客户端验证)
5.2.4设置专辑编辑表单
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Album</legend>
<p><input type="submit" value="Save"/></p>
</fieldset>
}
该视图中使用了两个方法,
1、Html.BeginForm:该方法上边已有介绍
2、Html.ValidationSummary:用来显示ModelState字典中所有验证错误的无序列表,使用布尔值类型参数(true)来告知辅助方法排除属性级别的错误,只显示ModelState中与模型本身有关的错误,而不显示与具体模型属性相关的错误。
3、示例:
ModelState.AddModelError("", "This is all wrong!");
ModelState.AddModelError("Title", "what a terrible name!");
在控制器某个操作中添加以上代码用来渲染编辑视图,
第一个错误是模型级别的,因为代码中没有提供关联错误与特定属性的键,
第二个错误是与属性相关联的错误,因此在视图验证摘要区不会显示这个错误
5.2.5 添加输入元素
1、Html.TextBox(和Html.TextArea)
调用形式如下:
@Html.TextBox("Title",Model.Title);
@Html.TextArea("text","Hello");
重载版本:@Html.TextArea("text","hello world",10,80,null);
渲染为<textarea cols="80", id="text" name="text" rows="10">hello world</textarea>
2、HTML.Label
该方法返回一个<lable/>元素,并用string类型的参数决定渲染的文本和特性值
Html.Label("GenreId")如下:<label for="GenreId">Genre</label>
我们可以发现label渲染的文本不是“GenreId",而是"Genre",在可能的情况下,辅助方法使用任何可用的模型元数据来生成显示内容
3、Html.DropDownList(和Html.ListBox)
这两个辅助方法都返回一个<select/>元素,DropdownList单选,ListBox多选(需设置属性)
Select元素的作用:
l 展示可选项的列表
l 展示字段的当前值
下来列表需要一个包含所有可选项的SelectListItem对象集合,其中每个SelectListItem对象又包含Text、Value、Selected属性,也可根据需要自己创建自己的SelectListItem对象集合,也可以使用框架中的SelectList或MultiSelectList辅助方法来构建。
如: ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
SelectList构造函数参数指定了原始集合(数据库中的Genres表),作为后台值使用的属性名称(GenreId),作为显示文本使用的属性名称(Name)以及当前选择项的值
4、Html.ValidationMessage
当ModelState字典中某一个特定字段出现错误时,可以使用ValidationMessage方法来显示相应的错误提示消息
例:首先在模型状态中为Title属性添加一个错误
ModelState.AddModelError("Title", "what a terrible name!");
在视图页可以这样显示错误提示消息:@Html.ValidationMessage("Title");
5.2.6 辅助方法、模型和视图数据
1、通过辅助方法赋予与Viewbag中的值相同的名称显示文本框的价格
如:在控制器中:ViewBag.Price=10.0;
在视图中:@Html.TextBox("Price");
如:在控制器中:ViewBag.Album=new Album{ Price=11};
在视图中: @Html.TextBox("Album.Price");
2、辅助方法依靠强类型的视图数据也能很好的工作
如:在控制器中:var album=new Album{ Price=12.0};
在视图(强类型)中:@Html.TextBox("Price");
3、向表单辅助方法提供显示的值
在控制器中:var album=storeDB.Albums.Single(a=>a.AlbumId==id);
ViewBag.Genres=new SelectList(storeDB.Genres.OrderBy(g=>g.Name),"GenerId","Name",album.GenreId);
在视图(强类型)中: @Html.TextBox("Title",Model.Title);
5.2.7 强类型辅助方法
该方法需要为其传递一个lambda表达式来指定要渲染的模型属性,且表达式的模型必须和为视图指定的模型类型一致。
例:@Html.LabelFor(m=>m.GenreId);
@Html.DropDownListFor(m=>m.GenreId,ViewBag.Genres as SelectList)
@Html.ValidationMessageFor(m=>m.Title)
这些强类型的辅助方法名都以For作为其后缀,使用lambda表达式可是轻松实现代码的重构
5.2.8 辅助方法和模型元数据
例:使用Label辅助方法来为流派选择列表显示一个label元素
@Html.Label("GenreId");
且该辅助方法生成如下标记:
<label for="GenreId">Genre </label>
当辅助方法询问运行时是否有GenreId的可得模型元数据时,运行时从装饰Album模型的Displayname 特性中获取的信息
[DisplayName("Genre")]
Public int GenreId{get;set;}
5.2.9 模板辅助方法
ASP.NET MVC 中的模板辅助方法利用元数据和模板构建HTML,其中元数据包括关于模型值(名称和类型)的信息和(通过数据注解添加的)模型元数据。
模板辅助方法有Html.Display和Html.Editor(分别对应强类型的方法Html.DisplayFor 和Html.EditorFor)
例:使用Html.TextBoxFor 辅助方法为某个专辑的Title属性生成以下特征
@Html.EditorFor(m=>m.Title);
两种方法生成同样的HTML标记,但是Html.EditorFor()方法使用更加广泛,在使用模板辅助方法时,运行时就可以生成合适的“编辑器”,在Title属性上添加如下注解
[DataType(DataType.MultilineText]
Public string Title{get;set;}
添加之后使用EditorFor方法渲染为:
<textarea class="text-box multi-line">Let me go</textarea>
5.2.10 辅助方法和ModelState
用来显示表单值的辅助方法也需要和ModelState交互。ModelState是模型绑定的副产品,粗有模型绑定期间检测到的所有错误,以及用户提交用来更新 模型的原始值
5.3 其他输入辅助方法
5.3.1 Html.Hidden
该方法用来渲染隐藏输入的元素
如:@Html.Hidden("Olive","Love");
渲染以后:<input id="Olive" name="Olive" type="hidden" value="Love"/>
5.3.2Html.Password
该方法用来渲染密码字段
如:@Html.Password("UserPassword")
强类型方法为:Html.PasswordFor(m=>m.UserPassword);
5.3.3 Html.RadioButton
如:@Html.RadioButton("color","red")
@Html.RadioButton("color","blue",true")
其对应的强类型方法:
@Html.RadioButtonFor(m=>m.GenreId,"1") Rock
在提交的时候后边会跟要提交的值
5.3.4 Html.CheckBox
CheckBox是唯一一个渲染两个输入元素的辅助方法
如:@Html.CheckBox("IsDiscouted");
渲染如下:<input id="IsDiscounted" type="checkbox" value="true"/>
<input id="IsDiscounted" type="hidden" value="false"/>
5.4 渲染辅助方法
渲染辅助方法可以在应用程序中生成指向其他资源的连接,也可构建被称作部分视图的可重用UI片段
5.4.1 Html.ActionLink和Html.RouteLink
Html.ActionLink辅助方法渲染指向另一个控制器操作的超链接,在后台使用路由API生成URL如:@Html.ActionLink("Link Text","AnotherAction")
则生成:<a href="/Home/AnotherAciton">Link Text</a>
当需要一个指向不同控制器的操作的连接时,如下:
@Html.ActionLink("Link Text","Index","ShoppinCart");
第一个参数为显示字段,第二位控制器中的操作名,第三个参数为控制器名去掉controller
在实际的应用中可能需要传递一个ID值或者其他参数值,这个时候可以传递RouteValueDictionary对象也可给routeValues参数传递一个对象(通常匿名类),在运行时查看对象的属性并用它来构建路由值,(属性名为参数名,属性值为参数)例:
为构建一个指向姓名为Olive的链接:
@Html.ActionLink("Show Love","Index","ShoppingCart",new { name="Olive"},null);
该方法的最后一个参数是htmlAttributes,即:通过该参数设置HTML元素的值,上面设置为null即没有设置任何特性,但是为调用ActionLink方法必须给其赋值
Html.RouteLink和Html.ActionLink方法遵循了相同的模式,但是,该方法只接受路由名称而不接受控制器名称和操作名称
如:@Html.RouteLink("Link Text",new {action="AnotherAction"})
5.4.2 URL辅助方法
URL辅助方法与HTML的ActionLink和RouteLink辅助方法相似,但是它是以字符串的形式返回这些URL的而非标记,有三个辅助方法:Action、Content、RouteUrl
如下:
Action方法和ActionLink方法相似
<span> @Url.Action("Browse","Store",new { genre="Jazz"},null}</span>
渲染成为:<span> /Store/Borwse?genre=Jazz</span>
RouteUrl方法和Action方法类似但是它只接收路由名称而不接受控制器和操作
Content方法可以将应用程序中的相对路径转换为绝对路径,如下:
<script src="@Url.Content("~/Scripts/sdf.js")"</script>
在传递为Content方法的字符串前使用波浪线作为第一个字符,无论应用程序部署在什么位置,该辅助方法都可以指向正确的资源,如果不加波浪线,挪动应用程序的位置则生成的URL无效
5.4.3 Html.Partial和Html.RenderPartial
Pattial方法将分部视图渲染成字符串,该方法共有四个重载版本,如下:
Public void Partial (string partialViewName);
Public void Partial (string partialViewName,object model);
Public void Partial (string partialViewName,ViewDataDictionary viewData);
Public void Partial (string partialViewName,object model,ViewDataDictionary viewData);
这里没有毕业为视图指定路径和文件扩展名,直接如下:
@Html.Partial("AlbumDisplay");
Partial方法相对灵活,RenderPartial方法相对于大量使用更有优势
5.4.4 Html.Action 和Html.RenderAction
Action是执行淡定的控制器操作并显示结果,且提供了更多的灵活性和重要性,因为控制器操作可以建立不同的模型,可以利用单独的控制器上下文
RenderAction直接喜人响应流,示例如:
Public class MyController{
Public ActionResult Index(){ return View();}
[ChildActionOnly]
Public ActionResult Menu(){ var menu=GetMenuFrom SomeWhere();
Return PartialView(menu);
}
Menu 操作构建一个菜单模型,并返回带有菜单的分部视图
在Index.cshtml页可以这样调用
<body>@Html.Action("Menu")<h1>Welcom</h1></body>
这里需要注意的是Menu操作使用了ChildActionOnlyAttribute特性标记,该特性设置防止了运行时直接通过URL来调用Menu操作,只能通过Action或RenderAction操作。在MVC3中,ControllerContext有一个IsChildAction属性,如果通过Action或RenderAction操作则为true,通过URL操作则为false,同时一些操作过滤器不同于子操作如:AuthorizeAttribute和OutputCacheAttribute
1、给RenderAction传递值
因为该操作方法调用的是操作方法,所以指定目标操作的一些额外操作是可以的,
如下:向菜单中添加一些项
① 定义新类:MenuOption
Public class MenuOption{
Public int Height{get;set;}
Public int Width{get;set;}
}
② 修改Menu操作,使其可以作为参数接受MenuOption对象
[ChildActionOnly]
Public ActionResult Menu(MenuOption options)
{
Return PartialView(options);
}
③ 在视图中可以通过Action调用传进菜单选项
@Html.Action("Menu",new { options=new MenuOptions{ width=400,Height=500}});
2、与ActionName特性结合使用
RenderAction方法优先使用ActionName特性值作为要调用操作的名称。如下注释:
[ChildActionOnly]
[ActionName("CoolMenu")]
Public ActionResult Menu(MenuOptions options)
{
Return PartialView(options);
}
当调用RenderAction方法时,需要确保操作名是CoolMenu而不是Menu。
ASP.NET MVC3学习心得-----表单和HTML辅助方法的更多相关文章
- ASP.NET MVC 3 之表单和 HTML 辅助方法(摘抄)
——选自<ASP.NET MVC3 高级编程(第5章) 孙远帅 译> 第5章 表单和HTML辅助方法 本章内容简介: * 理解表单 * 如何利用HTML辅助方法 * 编辑和输入的辅助方法 ...
- Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101
MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method ...
- 【ASP.NET MVC系列】浅谈表单和HTML辅助方法
[01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- 《ASP.NET MVC高级编程(4版)》读书笔记(5)表单和HTML辅助方法
5.1 表单使用 5.1.1 action 和 method 特性 <form action="/Home/Index"> <input name=&qu ...
- APS.NET MVC + EF (07)---表单和HTML辅助方法
在ASP.NET MVC中,可以借助HtmlHelper 对象来输出页面内容,提高开发效率.下面,我们将介绍一些常用的辅助方法. 7.1 HTML辅助方法 BeginForm 该辅助方法主要用来产生& ...
- ASP.NET MVC5 学习系列之表单和HTML辅助方法
一.表单 (一)Action和Method特性 Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址.这里的Url地址可以是相对的,也可以是绝对的.如下Form ...
- 表单和 HTML 辅助方法– ASP.NET MVC 4 系列
这里有一个疑问,诸如在文本编辑器中输入 HTML 元素如此简单的任务,也需要任何帮助吗?的确,输入标签名称是很容易的事,但是确保 HTML 页面链接中的 URL 指向正确的位置.表单元素 ...
- ASP.NET MVC5(三):表单和HTML辅助方法
表单的使用 Action和Method特性 Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址.这里的Url地址可以是相对的,也可以是绝对的.如下Form标签 ...
随机推荐
- spl_autoload_register array参数
spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册给定的函数作为 __autoload 的实现 说明¶ bool ...
- thinkphp 文件上传
form表单中 enctype="multipart/form-data" public function upload() { import('ORG.Net.U ...
- C# IO流的操作
C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...
- asp.net+MVC--1
1.MVC入门 1)第一个路由: /*任何应用程序启动时发生的动作都应该存在于单独的类中,并且仅在该方法中按照正确顺序调用*/ protected void Application_St ...
- django引用static目录下的css,js文件304问题
前提:django1.8 在html页面可以请求道css,js文件并在chrome的开发者工具中查看css,js文件返回状态为200 原因: html页面在头部添加了<!DOCTYPE html ...
- jQuery实现鼠标移到元素上动态提示消息框效果
当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...
- PHP学习心得(一)——简介
PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发. PHP 脚 ...
- JQuery 事件器的介绍
基本用法 $(元素). 事件( 事件属性); 常见事件 示例 说明 $(selector).click() 被选元素的点击事件 $(selector).dblclick() 被选元素的双击事件 $ ...
- PHP联合sqlserver2008使用的全过程 ( 原创 亲测)
一.环境 php5.2.5 sqlserver2008 win7 二.配置PHP 1.打开php.in将extension=php_mssql.dll的注释符号去掉. 2.打开php.in将mssql ...
- 2016031901 - U盘安装ubuntu系统
使用U盘安装ubuntu系统 01.进入u盘安装 个人使用的是闪迪U盘安装 02. 个人重装ubuntu 03.进入ubuntu安装界面 04.进入语言界面 05.准备安装ubuntu 06.ubun ...