页面开发辅助类—HtmlHelper初步了解

1.1 有失必有得

在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归。所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然。

但是,如果手写Html标签效率又比较低,可重用度比较低。这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码:


1

<input name="UserName" type="text" value="<%: ViewData["UserName"] %>" />

虽然以上代码可以解决问题,但是效率还是比较低,特别是在列表集合项较多的时候,工作量会比较大。那么,还有木有一种更好的方式呢?别急,微软已经为我们想好了策略。微软为开发人员快速开发前台页面提供了丰富的HtmlHelper的辅助类,辅助我们快速开发前台页面,也提供了可扩展的接口,前台页面的标签可以可以做到高度可重用

1.2 HtmlHelper初窥

我们可以通过在页面中通过Html.XXX来实现快速的Html标签编辑,并且可以方便地进行数据绑定。


1

<%: Html.Raw("<p>Hello,I am HtmlHelper!</p>") %>

那么,为什么可以在页面中调用Html.XXX方法呢?通过ILSpy反编译ViewPage页,我们可以看到原来在ViewPage下有一个HtmlHelper类型的属性-Html。(这下终于知道,为什么可以在页面中使用Html.xxxx()了)

那么这个HtmlHelper类又是一个什么类型的大神呢?继续反编译查看,在System.Web.Mvc命名空间下的HtmlHelper类型如下图所示,经过MSDN大神的讲解,HtmlHelper支持在视图中呈现 HTML 控件。那我们看看在此类中有木有传说中的TextBox、CheckBox的方法呢?经查看,木有。

那么,我们为什么可以在页面中使用Html.TextBox()方法呢?这里就涉及到一个叫做“扩展方法”的东东了,HtmlHelper 类的扩展方法在System.Web.Mvc.Html 命名空间中。 这些扩展添加了用于创建窗体、呈现 HTML 控件、呈现分部视图、执行输入验证等功能的帮助器方法。那么,有关如何自定义扩展方法请参阅本文第三部分,这里先卖个关子,暂不介绍。

1.3 为什么使用HtmlHelper?

思考这样一个场景:我们的项目第一个版本中的路由规则是这样的{controller}/{action}/{id},于是我们项目中所有的<a>标签所指向的都是以刚刚的规则命名的href(例如:<a href=’Home/User/1′></a>)。但是在第二版中,我们的路由规则也会变成了{controller}-{action}-{id},那么我们刚刚为超链接所设置的href便都无法正常访问了。这时,我们需要进行替换,单个替换或批量替换(例如改为:<a href=’Home-User-1′></a>),虽然也可以解决问题,但是无疑增加了工作量,效率很低。

那么,怎样来屏蔽这种变化所带来的不便呢?这里,通过使用HtmlHelper为我们提供的ActionLink标签,便可以解决这个问题。因为HtmlHelper是从服务器端自动帮你生成a标签,因此所生成的href会遵循目前的路由规则,也就帮我们屏蔽了变化,提高了工作效率。

二、没有服务器控件也能干大事—HtmlHelper重要方法介绍

PS:这里的实例均没有加<% %>或@符号,要运行请自行加上。

(1)ActionLink与RouteLink


1

2

3

4

5

6

7

8

9

10

Html.ActionLink("这是一个连接", "Index", "Home")

带有QueryString的写法

Html.ActionLink("这是一个连接", "Index", "Home", new { page=1 },null)

Html.ActionLink("这是一个连接", "Index", new { page=1 })

有其它Html属性的写法

Html.ActionLink("这是一个连接", "Index", "Home", new { id="link1" })

Html.ActionLink("这是一个连接", "Index",null, new { id="link1" })

QueryString与Html属性同时存在

Html.ActionLink("这是一个连接", "Index", "Home", new { page = 1 }, new { id = "link1" })

Html.ActionLink("这是一个连接", "Index" , new { page = 1 }, new { id = "link1" })

其生成的结果为:


1

2

3

4

5

6

7

8

9

10

<a href="/">这是一个连接</a>

带有QueryString的写法

<a href="/?page=1">这是一个连接</a>

<a href="/?page=1">这是一个连接</a>

有其它Html属性的写法

<a href="/?Length=4" id="link1">这是一个连接</a>

<a href="/" id="link1">这是一个连接</a>

QueryString与Html属性同时存在

<a href="/?page=1" id="link1">这是一个连接</a>

<a href="/?page=1" id="link1">这是一个连接</a>

RouteLink在用法几乎与ActionLink一致,这里就不再介绍,详情请参与MSDN;

(2)TextBox与TextArea

①TextBox


1

2

3

4

Html.TextBox("input1")

Html.TextBox("input2",Model.CategoryName,new{ @style = "width:300px;" })

Html.TextBox("input3", ViewData["Name"],new{ @style = "width:300px;" })

Html.TextBoxFor(a => a.CategoryName, new { @style = "width:300px;" })

其生成的结果为:


1

2

3

4

<input id="input1" name="input1" type="text" value="" />

<input id="input2" name="input2" style="width:300px;" type="text" value="Beverages" />

<input id="input3" name="input3" style="width:300px;" type="text" value="" />

<input id="CategoryName" name="CategoryName" style="width:300px;" type="text" value="Electronic" />

②TextArea


1

2

Html.TextArea("input5", Model.CategoryName, 3, 9,null)

Html.TextAreaFor(a => a.CategoryName, 3, 3, null)

其生成的结果为:


1

2

<textarea cols="9" id="input5" name="input5" rows="3">Electronic</textarea>

<textarea cols="3" id="CategoryName" name="CategoryName" rows="3">Electronic</textarea>

这里可以看到,我们可以使用强类型来生成Html标签,例如:Html.TextBoxFor(a => a.CategoryName, new { @style = “width:300px;” }),这里的CategoryName就是某个类型的属性。

(3)CheckBox


1

2

3

Html.CheckBox("chk1",true)

Html.CheckBox("chk1", new { @class="checkBox"})

Html.CheckBoxFor(a =>a.IsVaild, new { @class = "checkBox" })

其生成的结果为:


1

2

3

<input checked="checked" id="chk1" name="chk1" type="checkbox" value="true" /><input name="chk1" type="hidden" value="false" />

<input class="checkBox" id="chk1" name="chk1" type="checkbox" value="true" /><input name="chk1" type="hidden" value="false" />

<input checked="checked" class="checkBox" id="IsVaild" name="IsVaild" type="checkbox" value="true" /><input name="IsVaild" type="hidden" value="false" />

(4)DropDownList


1

2

Html.DropDownList("ddl1", (SelectList)ViewData["Categories"],  "--Select One--")

Html.DropDownListFor(a => a.CategoryName, (SelectList)ViewData["Categories"], "--Select One--", new { @class = "dropdownlist" })

其生成的结果为:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<select id="ddl1" name="ddl1">

<option value="">--Select One--</option>

<option value="1">Beverages</option>

<option value="2">Condiments</option>

<option selected="selected" value="3">Confections</option>

<option value="4">Dairy Products</option>

<option value="5">Grains/Cereals</option>

<option value="6">Meat/Poultry</option>

<option value="7">Produce</option>

<option value="8">Seafood</option>

</select>

<select class="dropdownlist" id="CategoryName" name="CategoryName">

<option value="">--Select One--</option>

<option value="1">Beverages</option>

<option value="2">Condiments</option>

<option value="3">Confections</option>

<option value="4">Dairy Products</option>

<option value="5">Grains/Cereals</option>

<option value="6">Meat/Poultry</option>

<option value="7">Produce</option>

<option value="8">Seafood</option>

</select>

(5)RadioButton


1

2

男<%: Html.RadioButton("Gender","1",true) %>

女<%: Html.RadioButton("Gender","2",false) %>

其生成的代码为:


1

2

男<input checked="checked" id="Gender" name="Gender" type="radio" value="1" />

女<input id="Gender" name="Gender" type="radio" value="2" />

(6)Encode与Raw

Encode会将内容进行编码话,因此,如果你的内容中含有Html标签的话那么会被解析成特殊字符,例如:


1

<%: Html.Encode("<p>哈哈</p>") %>

其生成的代码为:


1

&amp;lt;p&amp;gt;哈哈&amp;lt;/p&amp;gt;

这里主要是为了防止XSS攻击和恶意脚本,因此在MVC中,默认的<%: %>就实现了<%: Html.Encode() %>。但是,某些时候如果我们需要输出Html或JavaScript内容的字符串,这时我们可以使用HtmlHelper为我们提供的其他方法。例如我们要输出刚刚那句话,我们可以如下使用:


1

<%: Html.Raw("<p>哈哈</p>") %>

其生成的代码为:


1

<p>哈哈</p>

在HtmlHelper中还提供了许多的扩展方法供我们方便创建Html,比如:BeginForm、EndForm等。关于其他的方法介绍,请自行搜索,这里不再一一赘述。

三、随时随地我也能扩展—HtmlHelper扩展方法简介

3.1 扩展方法简介

借助MSDN的介绍:“扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。我们可以回到第一部分对HtmlHelper的扩展类-InputExtension类上,它是对于HtmlHelper的扩展,那么怎么鉴别它是HtmlHelper的扩展呢?

3.2 扩展方法的三要素

(1)静态类

可以从上图看出,InputExtension首先是一个静态类;

(2)静态方法

既然是静态类,那么其所有的方法必然都是静态方法,例如:public static MvcHtmlString CheckBox();

(3)this关键字

可以从方法名定义中看出,第一个参数都是this HtmlHelper htmlHelper,代表对HtmlHelper类的扩展;

3.3 自定义扩展方法

(1)在Models文件夹下新建一个类,取名为:MyHtmlHelperExt

(2)将MyHtmlHelperExt设置为static,并写入以下的一个静态方法:


1

2

3

4

public static HtmlString MyExtHtmlLabel(this HtmlHelper helper, string value)

{

      return new HtmlString(string.Format("<span style=‘font-weight:bold;‘>Hello-{0}-End</span>", value));

}

(3)确定满足了扩展方法的三要素之后,将命名空间改为:System.Web.Mvc。


1

namespace System.Web.Mvc

PS:为什么要改命名空间为System.Web.Mvc?

这是因为如果不改命名空间,我们要使用自定义的扩展方法需要在每个页面中引入Models(MyHtmlHelper所在的那个命名空间)这个命名空间,为了防止重复的命名空间引入操作(想想我们使用Html.TextBox()不也没有引入命名空间么?),于是我们将命名空间与HtmlHelper类所在的命名空间保持一致。

(4)在页面中我们就可以使用我们自己写的扩展方法了


1

<%: Html.MyExtHtmlLabel("EdisonChou") %>

(5)查看页面效果

参考文章:  http://blog.jobbole.com/84997/

(1)马伦,《ASP.Net MVC视频教程》,http://bbs.itcast.cn/thread-26722-1-1.html

(2)oer,《HtmlHelper使用大全》,http://www.cnblogs.com/oer2001/archive/2013/03/19/2968475.html

(3)MSDN,《扩展方法(C#编程指南)》,http://technet.microsoft.com/zh-cn/bb383977

(4)MSDN,《HtmlHelper类(System.Web.Mvc)》,http://msdn.microsoft.com/zh-cn/library/system.web.mvc.htmlhelper(v=vs.108).aspx

时间: 2024-12-24 01:15:01

页面开发辅助类—HtmlHelper初步了解的相关文章

页面前端的水有多深?再议页面开发

但凡从事互联网的人基本都会写几行html,用过Word的人用Dreamweaver也能做出规整的页面,所以大部分人会很自然地认为"页面 的开发没什么技术含量,很简单".不仅有这种普遍的认知,对从业者来说也有很多疑惑:做页面前端实现,没问题:兼容性,小case:图片集成,一直都在 用--还能有什么问题?瓶颈啊.天花板啊.转型啊.出路啊就在从业者中广泛讨论.是不是真的没什么问题了呢?网易邮箱前端技术中心也设立好几年了,似乎有 着讨论不完的话题,也经常会有一些新的想法让大家为之一振.那么页面

移动端页面开发

移动端页面开发 移动客户端的开发类型(站在前端立场上来说),主要是三种:Native App(原生APP),也就是完全使用移动设备系统语言写的客户端,iPhone iPad就是纯Object-C,安卓就是纯JAVA, 是性能最棒的开发方式,但灵活性不好.Web App, 就是在移动浏览器里打开的,纯HTML+CSS+JS,说白了就是个网页,只不过非常的富应用,比如手机浏览器访问的GMAIL.就是在浏览器里打开的页面.IOS支持可以在桌面创建访问的快捷方式,但是说到底还是打开Safari跑.而且对

移动端页面开发流程

移动端页面布局 一.移动端app分类 1.Native App原生app手机应用程序 使用原生的语言开发的手机应用,Android系统用的是java,ios系统用的是object-C 2.Hybrid App 混合型app手机应用程序 混合使用原生的程序和html5页面开发的手机应用 3.Web App 基于Web的app手机应用程序 完全使用html5页面加前端js框架开发的手机应用 二.Viewport视口 视口是移动设备上用来显示网页的区域,一般会比移动设备可视区域大,宽度可能是980px

微信页面开发 第三次总结

暂停微信页面开发,先处理yxt安卓司机版本. 司机端需求: 登入功能(由管理员分配账户),导航地图(提供搜索功能,寻找地点,快速导航) 接单控制=>是否接单,是否自动接单,接单类型 接单:当乘客抢到单后,司机有120秒时间可以抢单.参与抢单的司机会显示订单被抢,显示被谁抢.自己抢到,则显示去接乘客,或者呼叫乘客,去接乘客则显示路线导航,呼叫乘客则拨打乘客电话, 在接乘客时候显示距离和电话按钮,(乘客端可显示司机距离),司机点击接到乘客,订单状态变为服务中,同时,乘客端收到服务开始的消息. 服务过

手机页面开发总结_

1,图片像素不要用具体px,要用% px 2,左右边距也用%px 3,字体上,如果太小的px 手机上和电脑上是有区别的最好的情况是用em 4,对于get请求所带参数,参数之间不要留空格,不然读取数据时会取不到值 (面对如果名称没有错,值也有的情况,那么就观察你的url 看参数名称之后是否出现奇怪的字符) 5,面对多个单选框取值,首先为他们取同一个name 值(这样能保证它只能单选,不会出现多选)->给他们赋value值->循环单选框判断他们的checked 属性,在取值 6, 面对不同手机的不

HTML5页面开发的基础性模板

分享一个HTML5页面开发的基础性模板,包含了两个版本: 开发版本 注释版本 开发版本 <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8"> <title></title> <meta name=&q

Webpack之“多页面开发”最佳实战

前言:相信之前看过这篇文章,前端构建工具之“Webpack”的朋友,对于Webpack有了一定的了解.那么今天就跟大家分享下:如何利用webpack,来进行多页面项目实战开发. 一.项目初始化安装 1.先安装node.js 和 webpack 第一步:如果没有安装node的朋友,可以去node中文官网下载.安装好后,打开cmd工具,输入: 1  node - v // 如果有显示内容则证明安装成功(这是看我们node版本的指令) 如下图: 第二步: 全局安装webpack 1  npm  ins

【从零开始学BPM,Day5】报表配置及自定义功能页面开发

[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BPM10.0全开放免费下载:http://bbs.h3bpm.com/read.php?tid=861&fid=11 Step 2 安装资料:参考本博的"安装资料"分类 Step 3 产品在线帮助浏览:http://bbs.h3bpm.com/read.php?tid=286&

客户端发现_观影团活动页面开发与客户端新版跳转测试页面开发项目总结

   这一周过的是我理想的实习状态,手头有项目则忙项目,没项目则提高基础技能.那么下面来看看这周做的活动页面效果吧. 项目介绍 (一).观影团活动页面的开发 本项目页面的开发基本都是用之前用过的技术,不同之处在于乐帝之前的开发处于懵懂状态,现在回头看还是有些许的提高,对页面每一行代码都知道来龙去脉,弹出窗.对齐.居中布局都从本周阅读<前端开发修炼之道>有了更深层次的认识.css对齐与居中布局都不是单独属性完成的,而是有关联及触发的,而之前写页面不理解的恰恰是属性间的触发关系. 这里拿弹出窗的构