[转]我要学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, ...
随机推荐
- [bzoj1207][HNOI2004]打鼹鼠_动态规划
打鼹鼠 bzoj-1207 HNOI-2004 题目大意:题目链接. 注释:略. 想法: $dp_i$表示打到了第$i$个鼹鼠时最多打了多少个鼹鼠. $O(n)$转移即可. 总时间复杂度$O(n^2) ...
- P1165 日志分析 洛谷
https://www.luogu.org/problem/show?pid=1165 题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...
- IDUtil 永不重复的ID
package com.xxx.common.util; import java.util.Random; /** * 各种id生成策略 * * @version 1.0 */ public clas ...
- JDBC的结果集
以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/result-sets.html: SQL语句从数据库查询中获取数据,并将数据返回到结果集中.SELEC ...
- [转]Attribute在.net编程中的应用
Attribute在.net编程中的应用(一) Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是 ...
- Android GIS开发系列-- 入门季(11) Callout气泡的显示
一.气泡的简单显示 首先我们要获取MapView中的气泡,通过MapView的getCallout()方法获取一个气泡.看一下Callout的简单介绍: 大体的意思是通过MapView获取Callou ...
- html上传图片类型
<html> <head> <meta charset="utf-8"> <title>上传图片</title> ...
- python可变參数调用函数问题
一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keywo ...
- C#高级编程五十四天----Lookup类和有序字典
Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...
- 创建类模式大PK(总结)
创建类模式包含工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,它们都可以提供对象的创建和管理职责.当中的单例模式和原型模式很easy理解,单例模式是要保持在内存中仅仅有一个对象,原型模式是 ...