惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - Magic.Z

几种可能使 Windows 7 睡眠后自动唤醒的原因 IIS 7.5 下载文件遇到 404.3 试用 Entity Framework Power Tools CTP1 通过 WebBrowser 获取网页截图 WPF 客户端上传文件到 ASP.NET MVC 网站 开启 IE9 导航声音 WPF 实现屏幕文字提示 - Magic.Z - 博客园 AJAX 网页保留浏览器前进后退等功能 ADO.NET Entity Framework Feature 中的 CodeFirst 创建数据库和实体类 赠送 MSDN 订阅激活卡 在 ASP.NET WebForm 中使用 Route 注意防范ASP.NET中可能导致信息泄漏的漏洞 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds 用 Windows Media Center 浏览互联网视频 WebMatrix 简介 打印网页中的 GridView - Magic.Z ASP.NET 网站后台任务 Visual Studio 2010 中的 MSDN 帮助文档 在 ADO.NET Entity Framework 4 中使用枚举
在 ASP.NET MVC 中创建自定义 HtmlHelper
Magic.Z · 2010-09-21 · via 博客园 - Magic.Z

在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 <class="LinkTitle"><href="#">链接标题</a></p>
3 <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 2