[转]我要学ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件
本文转自:http://www.cnblogs.com/lukun/archive/2011/08/05/2128693.html
概述
在ASP.NET MVC框架中已经封装了很多基于Html标准的Html控件,我们可以方便的使用这些控件输出想要的内容,使开发变得快捷。
例如ASP.NET MVC框架包括以下设置标准的HTML控件(部分控件):
- Html.ActionLink()
- Html.BeginForm()
- Html.CheckBox()
- Html.DropDownList()
- Html.EndForm()
- Html.Hidden()
- Html.ListBox()
- Html.Password()
- Html.RadioButton()
- Html.TextArea()
- Html.TextBox()
使用这些控件做页面呈现

<div class="editor-label"> @Html.LabelFor(model => model.Name) </div> <div class="editor-field"> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div>

可见这些封装起来的控件,的确在使用起来带来了巨大的方便,但是仅仅这些控件,还是远远不能满足我们的需要。有时候我们希望写出自己的控件,输入几个文字或者属性名称更或者加入css样式,即可得出理想的效果。
Html控件的返回值
每一个Html控件都返回了MvcHtmlString ,他继承了HtmlString,微软把他定义为不能再次编辑的Html字符串。如MvcHtmlString : HtmlString。
知道了返回值我们就知道从哪里入手写自己的控件了。
自定义Html控件
先看个例子
我们用html写这样一段代码
<label for='male'>男</label> <input type="radio" name="sex" id="male" /> <br /> <label for='female'>女</label> <input type="radio" name="sex" id="female" />
其运行效果为:
男 女
在MVC项目中添加一个Controls文件夹
添加名为MyControls的类
代码:

public class MyControls { /// <summary> /// Lable文本 /// </summary> /// <param name="fortarget">for属性</param> /// <param name="text">显示文本</param> /// <returns></returns> public static MvcHtmlString Label(string fortarget, string text) { string str = String.Format("<label for='{0}'>{1}</label>", fortarget, text); return new MvcHtmlString(str); }
public static MvcHtmlString Label(string text) { return Label("",text); }
/// <summary> /// RadioButton /// </summary> /// <param name="nametarget">name属性</param> /// <param name="idtarget">id属性</param> /// <returns></returns> public static MvcHtmlString RadioButton(string nametarget, string idtarget) { string str = String.Format("<input type='radio' name='{0}' id='{1}' />", nametarget, idtarget); return new MvcHtmlString(str); } }

上面两个控件我们都返回了MvcHtmlString ,用于将String的内容显示为Html内容。
Html代码:
@using MvcApplication.Controls; @MyControls.Label("male", "男") @MyControls.RadioButton("sex", "male") <br /> @MyControls.Label("female", "女") @MyControls.RadioButton("sex", "female")
运行效果
可以看到与上面标准的Html代码效果是一样的。
Html控件自定义扩展
上面的例子我们可以看出自定义的控件完全可以让我们简单的实现自己想要的功能。
但是这些要使用自己的命名空间,而且还要找到自己定义的控件类,有点麻烦,能不能整合到系统自己的Html控件库呢?
像这种?
回答当然是肯定的,我们可以将这些自己的控件做为系统控件的扩展控件,在调用的时候不是就简单而且亲切嘛?
Html控件扩展类
先看下面的代码

// // 摘要: // 获取或设置 System.Web.Mvc.HtmlHelper 对象,该对象用于呈现 HTML 元素。 // // 返回结果: // 用于呈现 HTML 元素的 System.Web.Mvc.HtmlHelper 对象。 public HtmlHelper<TModel> Html { get; set; }

这是系统对页面上@Html属性的定义。
我们可以看到该Html是返回了一个HtmlHelper
看到这里我们的入口点就找到了,就是以HtmlHelper作为扩展类型。
继续在建好的Controls文件夹中建立名为LabelExtensions的类和RadioButtonExtensions的类
代码

public static class LabelExtensions { public static MvcHtmlString LKLabel(this HtmlHelper helper, string fortarget, string text) { string str = String.Format("<label for='{0}'>{1}</label>", fortarget, text); return new MvcHtmlString(str); } }
public static class RadioButtonExtensions { public static MvcHtmlString LKRadioButton(this HtmlHelper helper, string nametarget, string idtarget) { string str = String.Format("<input type='radio' name='{0}' id='{1}' />", nametarget, idtarget); return new MvcHtmlString(str);
} }

调用控件
此时我们再写Html控件看看
页面代码
@using MvcApplication.Controls; @Html.LKLabel("male", "男") @Html.LKRadioButton("sex", "male") <br /> @Html.LKLabel("female", "女") @Html.LKRadioButton("sex", "female")
运行效果
总结
对于控件的扩展极大的满足了我们在编程过程中的各种需求,使得我们在页面编程上面变得简单快捷。
作者:记忆逝去的青春 出处:http://www.cnblogs.com/lukun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过http://www.cnblogs.com/lukun/ 联系我,非常感谢。
[转]我要学ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件的更多相关文章
- asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息 在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...
- 《ASP.NET MVC企业实战》(二) MVC开发前奏
在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性. ...
- ASP.NET自定义控件组件开发 第一章 第一章:从一个简单的控件谈起
第一章:从一个简单的控件谈起 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第三 ...
- asp.net 简单实现禁用或启用页面中的某一类型的控件
我们在提交一个表单的时候,可能由于网络或服务器的原因,处理很慢,而用户在处理结果出来之前反复点击按钮提交.这样很容易造成不必要的麻烦甚至是错误.说了这么多,其实就是要实现一个禁用某些控件的一种功能.好 ...
- ASP.NET Core 2.1 : 十.升级现有Core2.0 项目到2.1
.NET Core 2.1 终于发布了, 赶紧升级一下. 一. 安装SDK 首先现在并安装 SDK(64-bit) 安装完毕后如果新建项目可以看到已经有2.1的选项了 二. 更新现有2.0项目到2.1 ...
- MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
先看一下我想要的结果: 很容易它就是一个单选按钮组,当我后台为Html对象(HtmlHelper的一个实例,它被定义在System.Web.Mvc名称空间下的WebViewPage类,即它对于所有MV ...
- ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- MVC中的自定义标签分页控件,仅供大家学习!!
public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, ...
随机推荐
- Java并发包——使用新的方式创建线程
Java并发包——使用新的方式创建线程 摘要:本文主要学习了如何使用Java并发包中的类创建线程. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/ ...
- Mac 系统引导过程概述 & BootCamp 的秘密
http://bbs.feng.com/read-htm-tid-6890655.html
- SQL Server中迁移数据的几种方法
1.通过工具"DTS"的设计器进行导入或者导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不 多,如果只是进行SQL Server数据库中部分表的 ...
- pymongo collection.save 问题
项目中有这样一个需求,把路由器信息存入mongo,DB的结构如下: { router_name: name, router_ip: ip, interfaces: [ {oid:1,name:if1} ...
- 手把手教你编写一个简单的PHP模块形态的后门
看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web ...
- CF #367 DIV2 E
直接使用指针,交换时交换矩阵周围的指针即可. #include <iostream> #include <cstdio> #include <cstring> us ...
- [WebGL入门]五,矩阵的基础知识
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:],另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- 经典面试题回答——学习Java基础的目的
本系列知识解释:相信每个学习Java的人都是从JavaSE開始的,也就是Java基础開始. 可是却并不清楚学习Java基础究竟有什么用? 首先我来回答这个问题,学习Java基础是有两个目 ...
- 科普:google的数字图书馆
https://books.google.com/ngrams Google Ngram Viewer,她利用google所拥有的所有图书作为资源,为你提供单词和短语历年使用次数的展示图标.数据化了数 ...
- msyql索引详解
一.mysql查询表索引命令两种形式 1.mysql>SHOW INDEX FROM 'biaoming' 2.mysql>SHOW keys FROM 'biaoming' 运行结果如下 ...