在 ASP.NET MVC 中创建自定义 HtmlHelper
在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的更多相关文章
- 在ASP.NET MVC中创建自定义模块
创建模块 module是实现了System.Web.IHttpModule接口的类.该接口定义了两个方法: Init:当模块初始化时被调用,传入的参数为HttpApplication对象,用于注册请求 ...
- asp.net mvc 中的自定义验证(Custom Validation Attribute)
前言
- 在ASP.NET Core中创建自定义端点可视化图
在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...
- ASP.NET MVC随想录——创建自定义的Middleware中间件
经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...
- 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 ...
- 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 ...
- 使用Rotativa在ASP.NET Core MVC中创建PDF
在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP.NET MVC,那么Rotativa工具已经可用,我们可以使用 ...
- ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)
在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...
随机推荐
- Express框架学习总结
最近学了Express框架,在学习的过程中,参考了一些资料,感觉Express框架比原生Node.js好用多了.下面我将我学习总结的内容如下: Express中文网 http://www.ex ...
- linux下python导出sybase 数据库 表记录的方式
导出sybase 数据库 表记录的方式 1 执行启动sybase 数据库命令 code : dbeng7 gkdb 2 执行 连接sybase 数据库命令code : dbisql -c " ...
- linux批量修改文件名的shell脚本
linux中批量修改文件名的shell脚本代码,主要是使用了rename,结合shell,喜欢的朋友可以参考下 使用 rename 命令 ======================== NAME ...
- cognos实现自动登陆common logon server
参考帖子:http://www.cognoschina.net/club/thread-29255-3-1.html 没有实现自动登录前,每次打开pyi 都要输入用户名密码,利用脚本加载的时候十分不方 ...
- CGAL Manual/tutorial_hello_world.html
Hello World Author CGAL Editorial Board 本教程是为知道C++和几何算法的基本知识的CGAL新手准备的.第一节展示了如何特化点和段CGAL类,以及如何应用几何谓词 ...
- JVM里面hashtable和hashmap实现原理
JVM里面hashtable和hashmap实现原理 文章分类:Java编程 转载 在hashtable和hashmap是java里面常见的容器类, 是Java.uitl包下面的类, 那么Hash ...
- CODEVS 1067 机器翻译
题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英 ...
- Vm image download resource
http://vmdepot.msopentech.com/List/Index http://www.hanselman.com/blog/Over400VirtualMachineImagesOf ...
- JUnit测试工具在项目中的用法
0:33 2013/6/26 三大框架整合时为什么要对项目进行junit测试: |__目的是测试配置文件对不对,能跑通就可以进行开发了 具体测试步骤: |__1.对hibernate进行测试 配置hi ...
- Codeforces Round #328 div2
Problem_A(592A): 题意: 在一个8*8的棋盘上有黑白两种棋子,'W'代表白色,'B'代表黑色. 玩家A执白子,先走. 白子只能向上走,黑子只能向下走.如果有障碍物则不能走, 比如白色的 ...