文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html

MVC在view页面,经常需要用到很多封装好的HTML控件,这篇文章主要讲述,怎么自己扩展和定制自己需要的控件。

----------------------------------------------------------

HTML Helper类是ASP.NET MVC框架中提供的生成HTML控件代码的类. 本质上与第一种方式一样, 只是我们可以不必手工书写HTML代码,而是借助HTML Helper类中的方法帮助我们生成HTML控件代码.

同时,我们也可以使用扩展方法为HTML Helper类添加自定义的生成控件的方法.

HTML Helper类的大部分方法都是返回一个HTML控件的完整字符串, 所以可以直接在需要调用的地方使用<% =Html.ActionLink() %>的形式输出字符串.

(1)ASP.NET MVC中的HtmlHelper类

在ViewPage中提供了Html属性, 这就是一个HtmlHelper类的实例. ASP.NET MVC框架自带了下面这些方法:

  • Html.ActionLink()
  • Html.BeginForm()
  • Html.CheckBox()
  • Html.DropDownList()
  • Html.EndForm()
  • Html.Hidden()
  • Html.ListBox()
  • Html.Password()
  • Html.RadioButton()
  • Html.TextArea()
  • Html.TextBox()

    上面列举的常用的HtmlHelper类的方法,并不是完整列表.

    下面的例子演示如何使用HtmlHelper类:

     <div>
    <% using (Html.BeginForm())
    { %>
    <label style="width:60px;display:inline-block;">用户名:</label>
    <% =Html.TextBox("UserName", "ziqiu.zhang", new { style="width:200px;" })%>
    <br /><br />
    <label style="width:60px;display:inline-block;">密码:</label>
    <% =Html.Password("Psssword", "123456", new { style = "width:200px;" })%>
    <% }%>
    </div>

    上面的代码使用Html.BeginForm输出一个表单对象, 并在表单对象中添加了两个Input, 一个使用Html.TextBox输出, 另一个使用Html.Password输出,区别是Html.Password输出的input控件的type类型为password.

    (2)扩展Html Helper类

    我们可以自己扩展HtmlHelper类, 为HtmlHelper类添加新的扩展方法, 从而实现更多的功能.

    在项目中建立Extensions文件夹, 在其中创建SpanExtensions.cs文件.源代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc; namespace System.Web.Mvc
    {
    public static class SpanExtensions
    {
    public static string Span(this HtmlHelper helper,string id, string text)
    {
    return String.Format(@"<span id=""{0}"">{1}</span>", id, text);
    }
    }
    }

    上面的代码我们为HtmlHelper类添加了一个Span()方法, 能够返回一个Span的完整HTML字符串.

    因为命名空间是System.Web.Mvc,所以页面使用的时候不需要再做修改,Visual Studio会自动识别出来:

    请大家一定要注意命名空间, 如果不使用System.Web.Mvc命名空间, 那么一定要在页面上引用你的扩展方法所在的命名空间, 否则我们的扩展方法将不会被识别.

    接下来在页面上可以使用我们的扩展方法:

     <div>
    <!-- 使用自定义的Span方法扩展HTML Helper -->
    <% =Html.Span("textSpan", "使用自定义的Span方法扩展HtmlHelper类生成的Span") %>
    </div>

    (3) 使用TagBuilder类创建扩展方法

    上面自定义的Span()方法十分简单, 但是有时候我们要构造具有复杂结构的Html元素, 如果用字符串拼接的方法就有些笨拙.

    ASP.NET MVC框架提供了一个帮助我们构造Html元素的类:TagBuilder

    TagBuilder类有如下方法帮助我们构建Html控件字符串:

    方法名称 用途
    AddCssClass() 添加class=””属性
    GenerateId() 添加Id,  会将Id名称中的"."替换为IdAttributeDotReplacement 属性值的字符.默认替换成"_"
    MergeAttribute() 添加一个属性,有多种重载方法.
    SetInnerText() 设置标签内容, 如果标签中没有再嵌套标签,则与设置InnerHTML 属性获得的效果相同.
    ToString() 输出Html标签的字符串, 带有一个参数的重载可以设置标签的输出形式为以下枚举值:

    • TagRenderMode.Normal -- 有开始和结束标签
    • TagRenderMode.StartTag -- 只有开始标签
    • TagRenderMode.EndTag -- 只有结尾标签
    • TagRenderMode.SelfClosing -- 单标签形式,如<br/>

    同时一个TagBuilder还有下列关键属性:

    属性名称 用途
    Attributes Tag的所有属性
    IdAttributeDotReplacement 添加Id时替换"."的目标字符
    InnerHTML Tag的内部HTML内容
    TagName Html标签名, TagBuilder只有带一个参数-TagName的构造函数.所以TagName是必填属性

    下面在添加一个自定义的HtmlHelper类扩展方法,同样是输出一个<Span>标签:

     public static string Span(this HtmlHelper helper, string id, string text, string css, object htmlAttributes)
    {
    //创意某一个Tag的TagBuilder
    var builder = new TagBuilder("span"); //创建Id,注意要先设置IdAttributeDotReplacement属性后再执行GenerateId方法.
    builder.IdAttributeDotReplacement = "-";
    builder.GenerateId(id); //添加属性
    builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); //添加样式
    builder.AddCssClass(css);
    //或者用下面这句的形式也可以: builder.MergeAttribute("class", css); //添加内容,以下两种方式均可
    //builder.InnerHtml = text;
    builder.SetInnerText(text); //输出控件
    return builder.ToString(TagRenderMode.Normal); }

    在页面上,调用这个方法:

    <% =Html.Span("span.test", "使用TagBuilder帮助构建扩展方法", "ColorRed", new { style="font-size:15px;" })%>

    生成的Html代码为:

    <span id="span-test" class="ColorRed" style="font-size: 15px;">使用TagBuilder帮助构建扩展方法</span>

MVC中使用HTML Helper类扩展HTML控件的更多相关文章

  1. 扩展GridView控件——为内容项添加拖放及分组功能

    引言 相信大家对GridView都不陌生,是非常有用的控件,用于平铺有序的显示多个内容项.打开任何WinRT应用或者是微软合作商的网站,都会在APP中发现GridView的使用.“Tiles”提供了一 ...

  2. 扩展GroupBox控件

    1.GroupBox的边框颜色可以自行设置: 2.GroupBox可以设置边框的为圆角: 3.设置GroupBox标题在控件中的位置. 4.设置GroupBox标题的字体和颜色. 具体实现步骤Pane ...

  3. MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...

  4. 【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下, ...

  5. VS2010/MFC对话框三:创建对话框类和添加控件变量

    创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是 ...

  6. c#中如何跨线程调用windows窗体控件

    c#中如何跨线程调用windows窗体控件?   我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...

  7. 安卓中的事件分发机制之View控件

    前言:Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent e ...

  8. ASP.NET中共有哪几种类型的控件?其中,HTML控件、HTML服务器控件和WEB服务器控件之间有什么区别

    ASP.NET的控件包括WEB服务器控件.WEB用户控件.WEB自定义控件.HTML服务器控件和HTML控件.HTML控件.HTML服务器控件和WEB服务器控件之间的区别如下所示.q      HTM ...

  9. VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...

随机推荐

  1. Intellij IDEA中使用Struts2

    据说struts2中有很多的漏洞, 不过作为学习我也就用了吧, 因为书上面是按着这个讲的呀. 难怪官网上也没有struts2.2.1的版本的下载. 1. 下载struts2.2.1 ga版本 2. 新 ...

  2. CentOS 6.5 64位 安装zabbix-2.2.0

    安装环境: VM 10 + CentOS-6.5-x86_64-minimal 虚拟机网络是NAT方式, 动态IP Xshell登录到Centos操作 刚装的centos,啥都没有,先配一下yum 首 ...

  3. 深入理解 C# 协变和逆变

    msdn 解释如下: “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型. “逆变”则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样,不过不够直白. 直白的理解: “协变” ...

  4. Java、fileless恶意软件威胁桌面安全

    工作原理:用户访问一个受侵的网站,不小心下载了最新类型的恶意软件.如果你的杀毒软件运行良好的话,就会阻止下载,至少能够检测到并隔离硬盘上的入侵文件.但是如果硬盘上没有文件监测呢?如果恶意软件只入侵内存 ...

  5. 进击的Hybrid App,量身定做缓存机制

    引用张图,简单粗俗的解释下 Native App.Web App 和 Hybrid App Navtie App: 使用平台系统提供的原生语言来编写的 App,如果Android用java,ios用o ...

  6. bootstrap学习笔记<十一>(导航条)

    基础导航条.样式:class="navbar navbar-default",属性:role="navigation" <div class=" ...

  7. w3c与微软(IE)事件注册区别 -Tom

    严格来说,有2中不同的模型:W3C模型和微软模型,除IE之外W3C模型支持所有的现代浏览器,而微软模型只支持IE,使用W3C模型的代码如下: // 格式:target.addEventListener ...

  8. 用Jquery获取select的value和text值

    $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 var checkText=$(&q ...

  9. js数组知识

    js数组   shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3, ...

  10. 进程 & 线程相关知识

    不管Java,C++都有进程.线程相关的内容.在这里统一整理吧. Python的线程,其实是伪线程,不能真正的并发.下面也有讲. 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序 ...