本文转自: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控件的更多相关文章

  1. asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化

    原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息         在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...

  2. 《ASP.NET MVC企业实战》(二) MVC开发前奏

    ​ 在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性.   ...

  3. ASP.NET自定义控件组件开发 第一章 第一章:从一个简单的控件谈起

    第一章:从一个简单的控件谈起 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第三 ...

  4. asp.net 简单实现禁用或启用页面中的某一类型的控件

    我们在提交一个表单的时候,可能由于网络或服务器的原因,处理很慢,而用户在处理结果出来之前反复点击按钮提交.这样很容易造成不必要的麻烦甚至是错误.说了这么多,其实就是要实现一个禁用某些控件的一种功能.好 ...

  5. ASP.NET Core 2.1 : 十.升级现有Core2.0 项目到2.1

    .NET Core 2.1 终于发布了, 赶紧升级一下. 一. 安装SDK 首先现在并安装 SDK(64-bit) 安装完毕后如果新建项目可以看到已经有2.1的选项了 二. 更新现有2.0项目到2.1 ...

  6. MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便

    先看一下我想要的结果: 很容易它就是一个单选按钮组,当我后台为Html对象(HtmlHelper的一个实例,它被定义在System.Web.Mvc名称空间下的WebViewPage类,即它对于所有MV ...

  7. ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations

    在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...

  8. ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

    应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...

  9. MVC中的自定义标签分页控件,仅供大家学习!!

    public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, ...

随机推荐

  1. Rikka with Phi 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

  2. [bzoj2229][Zjoi2011]最小割_网络流_最小割树

    最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...

  3. [bzoj2443][Usaco2011 Open]奇数度数_树形dp_生成树_并查集

    奇数度数 bzoj-2443 Usaco-2011 Open 题目大意:给定一个n个点m条便有向图,问是否有一种选出一些边的方式使得所有点的度数都是奇数. 注释:$1\le n \le 5\cdot ...

  4. dtrace.org

    http://dtrace.org/blogs/rm/2016/09/15/turtles-on-the-wire-understanding-how-the-os-uses-the-modern-n ...

  5. omnidazzle是mac的画笔工具

    先使用命令 brew cask install omnidazzle 试试,不行参考下面: http://macappstore.org/omnidazzle/

  6. 【Nginx】epoll及内核源码详解

    内核源码: https://www.nowcoder.com/discuss/26226?type=0&order=0&pos=21&page=1 epoll流程: 首先调用e ...

  7. prototype与几个循环的心得

    <一>prototypeprototype其实是函数的一个属性,并且只有函数有这个属性,这个属性就是给函数增加函数或者属性的,比如写一个function one(){},那么one.pro ...

  8. git基础之创建ssh公钥和密钥

    用git管理过程中,不想每次输入username和password.解决的方法例如以下; 1 . 链接换成ssh协议. 2 . 生成公钥. 3. 加入ssh公钥到gitserver. 打开gitbas ...

  9. HDU 5324 Boring Class【cdq分治】

    这就是一个三维排序的问题,一维递减,两维递增,这样的问题用裸的CDQ分治恰好能够解决. 如同HDU 4742(三维排序,一个三维都是递增的) 由于最小字典序比較麻烦,所以要从后面往前面做分治.每一个点 ...

  10. cocos2dx 2.2.3编译第一个apk到安卓手机

    1.android-ndk-r10(注意32位和64位的别下错了 我不小心下错了 折腾了我两天) 2.adt_201407(eclipse已经跟sdk等等集成在一起了)   3.Cococs2d-x ...