知识点3-6:HTML辅助方法
顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HTML辅助方法帮助你产生一些HTML标签或内容,因这些HTML标签都有固定标准的写法,所以将其包装成HTML辅助方法,可让View开发更快速,也可以避免不必要的语法错误。
ASP.NET MVC中内建了许多HTML辅助方法,这些HTML辅助方法都是利用C#3.0的扩充方法特性,将各种不同的HTML辅助方法扩充在HtmlHelper类别里,并且都拥有多载。
通过HTML辅助方法的讲解,可以协助你面对常见但又繁琐的HTML撰写工作,例如超链接、表单声明、表单元素、HTML编码与解码、载入分部视图页面、显示Model验证失败的错误信息等。
1.使用HTML辅助方法输出超链接
- @Html.ActionLink("链接文字","ActionName")
- @Html.ActionLink("链接文字","ActionName","ControllerName")
- @Html.ActionLink("链接文字","ActionName",new{id=123,page=5})
- @Html.ActionLink("链接文字","ActionName",null,new{@class="btnLink"})
使用Html.AcionLink()时,第一个参数为超链接的显示文字,此参数不可以输入空字符串、空白字符串或null值,否则会跑出The Value cannot be null or empty的异常。
提问>>:如果想设计一个包含超链接的图片按钮,该如何操作?
可选择用<a>超链接标签来输出,并通过CSS加上一个背景图,如下。
<a href="@Url.Action("ActionName")" class="lnkButton"></a>
还可以直接做一个图片超链接:
<a href="/Home/Index"><img src="~/Images/accent.png" /></a>
ASP.NET MVC还有另一个Html.RouteLink辅助方法,其用法与Html.ActionLink非常相似,差别仅在于输入的参数要以RouteValue为主。
2.使用HTML辅助方法输出表单
(1)产生表单元素
使用using语法产生表单标签:
@using(Html.BeginForm("About","Home"))
{
@Html.TextArea("Date")
@Html.TextArea("MEMO")
<input type="submit"/>
}
使用Html.BeginForm辅助方法输出的表单预设输出的method属性会是POST,如果想指定为GET的话,可以输入第三个参数,如下。
@using(Html.BeginForm("Search","Home",FormMethod.Get))
{
@Html.TextArea("Keyword")
<input type="submit" />
}
如果想要用HTML表单实现文件上传的功能,那么必须在输出的<form>表单标签加上一个enctype属性,且内容必须设定为multipart/form-data,如下。
@using(Html.BeginForm("Upload","File",FormMethod.Post,new{enctype="multipart/form-data"}))
{
@Html.TextBox("File1","",new{type="file",size="25"})
<input type="submit"/>
}
Html辅助方法并没有File方法,因此必须用TextBox方法来代替,并传入第三个参数将内建的type属性换成file即可。
(2)模拟各种HTTP动词
由于HTML表单无法送出DELETE这个HTTP动词,如果希望Action能够提供如同RESTful风格的方式来处理删除动作,又同时能够利用同一个表单来使用这个只能允许HttpDelete的动作的话,可以利用Html.HttpMethodOverride这个HTML辅助方法来模拟HTTP DELETE的行为,而模拟的方法其实只是加入一个隐藏栏位在表单里而已。
@using(Html.BeginForm("DeleteMessage","Message")
{
@Html.HttpMethodOverride(HttpVerbs.Delete)
@Html.Hidden("ID")
<input type="submit" value="删除此条数据" />
}
(3)常用表单输入栏位
Html.BeginForm()
Html.EndForm()
Html.Label()
Html.TextBox()
Html.TextArea()
Html.Password()
Html.CheckBox()
Html.RadionButton()
Html.DropDownList(),输出<select>标签。
Html.ListBox()
Html.Hidden()
Html.ValidationSummary()
Html.Id()
Html.Name()
Html.Value()
标签和文本框使用如下:
@Html.Label("Username","账户")
@Html.TextBox("Username")
标签for属性的值与input的id属性值一致的话,点击标签光标就会停留在文本框上,增加表单的易用性。Html.TextBox的多载如下:
@Html.TextBox("Username", "will")
@Html.TextBox("Username", "will", new { id="testID"})
public ActionResult HelperSample1()
{
IDictionary<string, object> attr = new Dictionary<string, object>();
attr.Add("size", "32");
attr.Add("style", "color:red;");
ViewData["Dictionary"] = attr;
return View();
}
@{
var htmlAttribute = ViewData["Dictionary"] as IDictionary<string, object>;
}
@Html.TextBox("name","Value",htmlAttribute)<br />
@Html.Password("password","Value",htmlAttribute)<br />
@Html.TextBox("email","Value",htmlAttribute)<br />
@Html.TextBox("tel","Value",htmlAttribute)<br />
@Html.Hidden("id","1")
Html.DropDownList()的使用方式如下。
public ActionResult HelperSample2()
{
List<SelectListItem> listItem = new List<SelectListItem>();
listItem.Add(new SelectListItem { Text = "是", Value = "1" });
listItem.Add(new SelectListItem { Text = "否", Value = "0" });
ViewData["List"] = new SelectList(listItem, "Value", "Text", "");
return View();
}
@Html.DropDownList("List", ViewData["List"] as SelectList, "请选择")
(4)使用强类型辅助方法
ASP.NET MVC从2.0版开始更进一步地提供了强类型的辅助方法,避免因为输入错误而导致数据没有显示或是编辑时无法存储的问题,除此之外,如果能活用这些强类型辅助方法还能提升整体开发效率。
基本上,属于强类型的辅助方法命名方式皆为“原先的名称最后加上For”,例如,Html.TextBoxFor()或Html.LabelFor()。使用强类型辅助方法,在View页面的最上方一定要用@model定义出这个View页面的参考数据模型。
Html.LabelFor(),显示字段的名字。
Html.TextBoxFor()
Html.TextAreaFor()
Html.PasswordFor()
Html.CheckBoxFor()
Html.RadioButtonFor()
Html.DropDownListFor()
Html.ListBoxFor()
Html.HiddenFor() ,生成HTML窗体的隐藏域。
Html.NameFor()
Html.ValueFor()
Html.DisplayNameFor(),获取模型的显示名称,有时是模型实体类的名称。
Html.DisplayTextFor()
Html.ValidationMessageFor(),是用来显示字段验证的错误消息。
Html.EditorFor(),用来输出表单域可编辑文本框。
做一个例子,首页显示商品明细,点击添加商品链接,打开添加商品页面,输入信息可添加商品。商品的模型类和添加商品页面代码如下:
public class Product
{
public int Id { get; set; } [Required]
[DisplayName("产品名称")]
public string Name { get; set; } [MaxLength(200)]
[DisplayName("产品说明")]
public string Description { get; set; } [Required]
public int UnitPrice { get; set; }
}
@model MvcApplication1.Models.Product @using(Html.BeginForm())
{
@Html.ValidationSummary(true) <fieldset>
<legend>产品资讯</legend> <div class="editor-lable">
@Html.LabelFor(model=>model.Name)
</div>
<div class="editor-field">
@Html.TextBoxFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
</div> <div class="editor-label">
@Html.LabelFor(model=>model.Description)
</div>
<div class="editor-label">
@Html.TextAreaFor(model=>model.Description)
@Html.ValidationMessageFor(model=>model.Description)
</div> <p>
<input type="submit" />
</p>
</fieldset>
}
3.使用HTML辅助方法载入分部视图
以往在ASP.NET Web form的开发经验中,对于User Control使用非常频繁,不但可以减少重复的代码,也利于将页面模块化,这个好用的概念也可以用在ASP.NET MVC中,只不过换了一个名字,称为“分部视图(Partial View)”。
(1)什么是分部视图
从Partial View的字面上翻译,很容易了解它就是一个片段的View,因此,可以利用Partial View把部分的HTML或显示逻辑包装起来,方便重复引用。当你将建立出来的分部视图放置于View\Shared目录时,任何Controller下的Action或View都可以载入。
分部视图的应用范围相当广,因为是片段的HTML或显示逻辑,因此,整体重复性高或某段HTML会共同出现在多个视图页面中的网页片段,利用分部视图来开发会是不错的选择,并且基于这个优点,Ajax技术所需要的片段View也就更适合使用分部视图。
(2)如何建立一个分部视图
建立分部视图与建立视图的步骤一样,在项目的/Views/Shared目录上,单击鼠标右键,在弹出的快捷菜单中选择“添加”->“视图”命令。接着,选中“创建为分部视图”复选框即可。
使用分部视图不一定需要建立相关的Action,因为它仅仅是片段的HTML,且调用时,也不会调用Action来执行。
(3)如何载入分部视图
Partial(HtmlHelper, String) | Html.Partial("ajaxPage")
Partial(HtmlHelper, String, Object) | Html.Partial("ajaxPage", Model)
Partial(HtmlHelper, String, ViewDataDictionary) | Html.Partial("ajaxPage", ViewData["Model"])
Partial(HtmlHelper, String, Object, ViewDataDictionary) | Html.Partial("ajaxPage", Model, ViewData["Model"])
例子1,分部视图OnlineUserCounter代码如下。
<span style="color:red">线上人数:88888</span>
在Home/Index视图中载入分部视图。
@Html.Partial("OnlineUserCounter")
(4)从控制器载入分部视图
(5)使用Html.Action辅助方法载入分部视图
4.使用视图模板输出内容
5.自定义HTML辅助方法
使用HTML辅助方法可以让开发View页面的过程节省不少时间,但有时候难免会觉得内建的HTML辅助方法不太够用,怎么办才好呢?ASP.NET MVC的另一项优点就是“高扩充性”,此刻就派上用场。ASP.NET MVC允许开发人员自行扩充HTML辅助方法,而且方法众多,你可以选择喜爱的方式来建立适当的HTML辅助方法。
6.Html.ValidationSummary()可以输出表单验证失败时的错误信息摘要
知识点3-6:HTML辅助方法的更多相关文章
- asp.net mvc 3.0 知识点整理 ----- (3).HtmlHelper(Html 辅助方法)介绍
在View视图中,Html的类型是System.Web.Mvc.HtmlHelper<T>, 所有的辅助方法都需要和ModelState交互.那么,ModelState是什么呢?它是模型绑 ...
- Ruby Rails学习中:Ruby内置的辅助方法,基础内容回顾补充
一. Ruby内置的辅助方法 1.打开文件:app/views/layouts/application.html.erb(演示应用的网站布局) 来咱把注意力放在圈起来的那一行: 这行代码使用 Rail ...
- MVC学习系列4--@helper辅助方法和用户自定义HTML方法
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...
- 《ASP.NET MVC高级编程(4版)》读书笔记(5)表单和HTML辅助方法
5.1 表单使用 5.1.1 action 和 method 特性 <form action="/Home/Index"> <input name=&qu ...
- MVC辅助方法
我相信很多人虽然经常用mvc去做一些东西,但是可能很少使用mvcHtml辅助方法 首先我们要创建一个mvc项目 二创建一个HtmlHelper文件夹 三编写文件 四调用辅助方法 调用辅助方法 和使用其 ...
- ASP.NET 中HTML和Form辅助方法
Form辅助方法 Form最重要的属性就是action和method,action指明form中的数据被提交到哪里,method指明用什么方法,默认为GET,下面是一个简单的例子: <form ...
- MVC之路随记3--Html辅助方法
概述:MVC中使用@Html.MethodName 来做很多Html的事情,简化了开发工程量,使用方便,并且易于理解 详细方法: 1.表单 <form action="/Home/Se ...
- 表单和 HTML 辅助方法– ASP.NET MVC 4 系列
这里有一个疑问,诸如在文本编辑器中输入 HTML 元素如此简单的任务,也需要任何帮助吗?的确,输入标签名称是很容易的事,但是确保 HTML 页面链接中的 URL 指向正确的位置.表单元素 ...
- MVC中使用内建的HTML辅助方法产生表单元素提交表单与button按钮事件的陷阱
网站模板页有个登陆的退出按钮,当点击时跳转到登陆页面. <button onclick="logout()" >退出</button> $("#l ...
随机推荐
- HDU 2665(Kth number-区间第k大[内存限制+重数])
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 关于移动端 rem 布局的一些总结
[资源一]基础知识恕不回顾 基础知识参考以下两篇博客: http://isux.tencent.com/web-app-rem.html http://www.w3cplus.com/css3/def ...
- char*与char[]
char *s1="hello"; // 指向常量区 char s2[]="hello"; // 指向数组的内存空间 char *s1 的s1是指针,指 ...
- shell:监控进程运行状态并自动重启进程
#!/bin/sh MAXRSTCOUNT=; PROCTOGO=/mnt/hgfs/code/test/show #count is the counter of test started time ...
- [C#参考]byte数组和Image的相互转换
功能需求 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组在内存中操作. 2.把内存中的byte数组转换成Image对象,赋值给相应的控件显示. 3.从图片byte数组得到 ...
- git配合tortoiseGit的基础使用
转载自:http://www.cnblogs.com/ssor/archive/2012/02/04/2337823.html 一定要自己写出来才能牢记,所以我来写一下 git确实比svn好用的多了, ...
- [LeetCode]题解(python):023-Merge k Sorted Lists
题目来源: https://leetcode.com/problems/merge-k-sorted-lists/ 题意分析: 给定k个有序的链表,将这些链表整合成一个新的有序链表. 题目思路: 前面 ...
- ubuntu下配置nginx+uwsgi+django
服务器配置是Ubuntu14.04 64位OS ubuntu14.04默认是安装好了python2.7版本不用自己安装了. 先更新下源 sudo apt-get update 第一步先安装pip su ...
- 动态弹球的实现 加入了多线程技术--javaSE游戏准备工作
任务描述:实现了动态弹球的功能,对于有弹球功能的SE游戏奠定了基础. package 运用线程技术的小球; import java.awt.*; import java.awt.event.*; im ...
- http Post 请求一网络资源返回字符串
public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader ...