在ASP.NET MVC应用程序的开发中,我们常碰到类似Html.Label或Html.TextBox这样的代码,它将在网页上产生一个label或input标记。这些HtmlHelper的扩展方法有些像WebForm中的控件,只需传入一些参数即可生成相应的HTML代码。本文将介绍创建HtmlHelper的方法。

Html.Textbox方法的返回值是MvcHtmlString,它生成了一些HTML代码。创建HtmlHelper,就像在生成HTML代码。下面以一个带有简要描述功能的链接HtmlHelper为例介绍创建自定义HtmlHelper的方法。它将显示一个链接并在下方简要介绍该与该链接内容有关的信息。在某些带有简要描述的项列表页上可能会需要类似的功能。最后的结果预览如下图。


上面使用了3次自定义的HtmlHelper,每次生成的代码如下

1 <div>
2 <p class="LinkTitle"><a href="#">链接标题</a></p>
3 <p class="LinkDescription">链接描述</p>
4 </div>

可能稍微有点复杂,因为有了标签的嵌套。

做好准备工作以后,新建一个静态类LinkWithDescriptionExtensions,添加静态方法LinkWithDescription,代码如下


代码

 1 /// <summary>
 2 /// 带描述的链接扩展方法
 3 /// </summary>
 4 /// <param name="htmlHelper">要扩展的HtmlHelper类</param>
 5 /// <param name="title">标题</param>
 6 /// <param name="url">链接地址</param>
 7 /// <param name="description">描述</param>
 8 /// <returns>HTML代码</returns>
 9 public static MvcHtmlString LinkWithDescription(this HtmlHelper htmlHelper, string title, string url, string description)
10 {
11     // 生成与标题链接有关的HTML代码
12     TagBuilder titleContainer = new TagBuilder("p");    // 标题链接容器p
13     TagBuilder titleLink = new TagBuilder("a");    // 标题中的文字要有链接,所以包含在a标签内
14     titleLink.MergeAttribute("href", url);    // 为a添加href属性并指定链接地址
15     titleLink.SetInnerText(title);    // 标题文字
16     titleContainer.InnerHtml = titleLink.ToString();    // 将a放到p中
17     titleContainer.AddCssClass("LinkTitle");    // 为标题添加样式
18 
19     // 生成与链接描述有关的HTML代码
20     TagBuilder descriptionContainer = new TagBuilder("p");    // 连接描述容器p
21     descriptionContainer.InnerHtml = description;    // 描述文字
22     descriptionContainer.AddCssClass("LinkDescription");    // 为描述添加样式
23 
24     // 将上述元素放入一个DIV中
25     TagBuilder div = new TagBuilder("div");
26     div.InnerHtml = string.Format("{0}{1}", titleContainer.ToString(), descriptionContainer.ToString());
27 
28     // 返回生成的HTML代码
29     return MvcHtmlString.Create(div.ToString());
30 }

先理清结构再使用TagBuilder生成HTML代码是比较方便的。这里也可以使用拼接字符串的方式来生成HTML代码,只要最后得到所需的HTML代码就可以,但是我个人不建议使用拼接字符串的方式,这样不仅思维容易混乱而且容易出错。使用TagBuilder既结构清晰,又不容易出错。

在ASPX页中,可以使用

1 <%:Html.LinkWithDescription("测试链接1", "#", "这是测试链接1的描述")%>
2 <%:Html.LinkWithDescription("测试链接2", "#", "这是测试链接2的描述")%>
3 <%:Html.LinkWithDescription("测试链接3", "#", "这是测试链接3的描述")%>

来调用上面的扩展方法,这里的链接标题、链接地址和描述等信息可以通过ViewData等方式传入。在Action中写


代码

 1 /// <summary>
 2 /// Demo
 3 /// </summary>
 4 /// <returns>Demo视图</returns>
 5 public ActionResult Demo()
 6 {
 7     // 创建链接信息列表
 8     List<LinkInfo> links = new List<LinkInfo>();
 9     links.Add(new LinkInfo { Description = "这是测试链接1的描述", Title = "测试链接1", Url = "#" });
10     links.Add(new LinkInfo { Description = "这是测试链接2的描述", Title = "测试链接2", Url = "#" });
11     links.Add(new LinkInfo { Description = "这是测试链接3的描述", Title = "测试链接3", Url = "#" });
12 
13 
14     ViewData["Links"] = links;
15 
16     return View();
17 }

在ASPX页中写

1 <%List<LinkInfo> links=ViewData["Links"] as List<LinkInfo>;
2 foreach (var link in links)
3 {   %>
4 <%:Html.LinkWithDescription(link.Title, link.Url, link.Description)%>
5 <%} %>

示例下载

在 ASP.NET MVC 中创建自定义 HtmlHelper的更多相关文章

  1. 在ASP.NET MVC中创建自定义模块

    创建模块 module是实现了System.Web.IHttpModule接口的类.该接口定义了两个方法: Init:当模块初始化时被调用,传入的参数为HttpApplication对象,用于注册请求 ...

  2. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  3. 在ASP.NET Core中创建自定义端点可视化图

    在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...

  4. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  5. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

    ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...

  6. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  7. MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型

    为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By  Tom Dykstra |July 30, 2013 Translated by litdwg   ...

  8. 使用Rotativa在ASP.NET Core MVC中创建PDF

    在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP.NET MVC,那么Rot​​ativa工具已经可用,我们可以使用 ...

  9. ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)

    在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...

随机推荐

  1. Express框架学习总结

    最近学了Express框架,在学习的过程中,参考了一些资料,感觉Express框架比原生Node.js好用多了.下面我将我学习总结的内容如下: Express中文网     http://www.ex ...

  2. linux下python导出sybase 数据库 表记录的方式

    导出sybase 数据库 表记录的方式 1 执行启动sybase 数据库命令 code : dbeng7 gkdb 2 执行 连接sybase 数据库命令code : dbisql -c " ...

  3. linux批量修改文件名的shell脚本

    linux中批量修改文件名的shell脚本代码,主要是使用了rename,结合shell,喜欢的朋友可以参考下 使用 rename 命令  ========================  NAME ...

  4. cognos实现自动登陆common logon server

    参考帖子:http://www.cognoschina.net/club/thread-29255-3-1.html 没有实现自动登录前,每次打开pyi 都要输入用户名密码,利用脚本加载的时候十分不方 ...

  5. CGAL Manual/tutorial_hello_world.html

    Hello World Author CGAL Editorial Board 本教程是为知道C++和几何算法的基本知识的CGAL新手准备的.第一节展示了如何特化点和段CGAL类,以及如何应用几何谓词 ...

  6. JVM里面hashtable和hashmap实现原理

    JVM里面hashtable和hashmap实现原理   文章分类:Java编程 转载 在hashtable和hashmap是java里面常见的容器类, 是Java.uitl包下面的类, 那么Hash ...

  7. CODEVS 1067 机器翻译

    题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英 ...

  8. Vm image download resource

    http://vmdepot.msopentech.com/List/Index http://www.hanselman.com/blog/Over400VirtualMachineImagesOf ...

  9. JUnit测试工具在项目中的用法

    0:33 2013/6/26 三大框架整合时为什么要对项目进行junit测试: |__目的是测试配置文件对不对,能跑通就可以进行开发了 具体测试步骤: |__1.对hibernate进行测试 配置hi ...

  10. Codeforces Round #328 div2

    Problem_A(592A): 题意: 在一个8*8的棋盘上有黑白两种棋子,'W'代表白色,'B'代表黑色. 玩家A执白子,先走. 白子只能向上走,黑子只能向下走.如果有障碍物则不能走, 比如白色的 ...