using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc; namespace MyEF.ExtentionHtmlHelper
{
public static class ImageHelper
{
//说明:因为C#3.0的扩充方法是一种特殊的静态方法,因此在开发Html辅助方法时必须声明为
//静态方法(static method)并放在一个静态的类别里面!此外自定义的Html方法还有一个重点,那就是从Html辅助方法里,回传的类型可以使简单的String字符串类型,也可以是System.Web.MvcHtmlString类别,差别在于,通过rasor输出的Html预设就会对所有输出的Html编码动作,所以如果回传string字符串类型,其输出的内容将会被Html编码后输出,如果你从Html辅助方法回传MvcHtmlString类型的话,如果内容包含标签数据,那么就会原封不动的输出Html标签,以我们的这个范例来说,必须回传MvcHtmlString类别,代码范例如下:
public static MvcHtmlString HtmlImg(this HtmlHelper helper, string url, string alternateText, string title)
{
return MvcHtmlString.Create(string.Format("<img src='{0} alt={1}' title='{2}' />", url, alternateText, title));
}
public static MvcHtmlString HtmlImg(this HtmlHelper helper, string linkUrl, string target, string imgUrl, string alterText, string title)
{
StringBuilder sb = new StringBuilder();
sb.Append("<a href=\"");
sb.Append(linkUrl);
sb.Append("\" target=\"");
sb.Append(target);
sb.Append("\">");
sb.Append("<img src=\"");
sb.Append(imgUrl);
sb.Append("\"");
sb.Append("\" alt=\"");
sb.Append(alterText);
sb.Append("\"");
sb.Append("\" title=\"");
sb.Append(title);
sb.Append("\" /></a>");
return MvcHtmlString.Create(sb.ToString());
}
}
}

  这种利用StringBuilder组子串的方式没有任何弹性,ASP.NET MVC专门为了产生HTML标签的需求而设计了一个TagBuilder类别,能够以更物件化的方式产生HTML标签,接着来改写上述范例,以TagBuilder实例如下:

 public static MvcHtmlString ImageLink(this HtmlHelper helper,string actionName,string imgUrl, string alternateText,object routeValues,object linkHtmlAttributes,object imageHtmlAttributes)
{
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
var url = urlHelper.Action(actionName, routeValues);
//建立链接
var linkTagBuilder = new TagBuilder("a");
linkTagBuilder.MergeAttribute("href", url);
linkTagBuilder.MergeAttributes(new RouteValueDictionary(linkHtmlAttributes)); //建立图片
var imageTagBuilder = new TagBuilder("img");
imageTagBuilder.MergeAttribute("src", urlHelper.Content(imgUrl));
imageTagBuilder.MergeAttribute("alt",alternateText);
imageTagBuilder.MergeAttribute("title",alternateText);
imageTagBuilder.MergeAttributes(new ViewDataDictionary(imageHtmlAttributes)); //将图片加之连接中
linkTagBuilder.InnerHtml = imageTagBuilder.ToString(TagRenderMode.SelfClosing);
return MvcHtmlString.Create(linkTagBuilder.ToString());
}

  

  /// <summary>
/// 工作类型HtmlHelper
/// </summary>
/// <param name="helper"></param>
/// <param name="natureWork"></param>
/// <returns></returns>
public static MvcHtmlString ExtendNatureWork(this HtmlHelper helper, string natureWork) {
var sb = new System.Text.StringBuilder();
var flag = natureWork.IsNull();
var arr = natureWork.IsNull() ? new string[1] : natureWork.Split(',');
foreach (var item in Macrosage.Utility.TypeHelper.ToDictionary(Macrosage.Utility.EnumHelper.JobType.实习).Where(x => x.Key != "3")) {
if (item.Key == "1") {
sb.AppendFormat("<span {0} data-id=\"{2}\"><em class=\"icon\"></em>{1}</span>", arr.Contains(item.Key) || flag ? "class='current'" : string.Empty, item.Value, item.Key);
}
else if (item.Key == "2") {
sb.AppendFormat("<span {0} data-id=\"{2}\"><em class=\"icon\"></em>{1}</span>", arr.Contains(item.Key) ? "class='current'" : string.Empty, item.Value, item.Key);
}
else {
sb.AppendFormat("<span {0} data-id=\"{2}\"><em class=\"icon\"></em>{1}</span>", arr.Contains(item.Key) ? "class='fix_noboder current'" : string.Empty, item.Value, item.Key);
}
}
return MvcHtmlString.Create(sb.ToString());
}

  

        public static MvcHtmlString ExtendMy(this HtmlHelper helper, string welfare) {
var stringBulider = new StringBuilder();
var arr = welfare.IsNull() ? new string[1] : welfare.Split(",");
var data = EnumHelper.Welfare.Where(x => x.Key != "9");
foreach (var item in data) {
var index = data.ToList().IndexOf(item) + 1;
stringBulider.AppendFormat("<span class=\"{0} {2}\" data-id=\"{3}\"><em class=\"icon\"></em>{1}</span>", arr.Contains(item.Value) ? "current" : string.Empty, item.Value, index.Equals(data.Count()) ? "fix_noboder" : string.Empty, item.Key);
}
return MvcHtmlString.Create(stringBulider.ToString());
}

  

Asp.net MVC4.0自定义Html辅助方法的更多相关文章

  1. 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)

    一.背景 在越来越重视用户体验的今天,换肤功能也慢慢被重视起来.一个web系统用户可以选择一个自己喜欢的系统主题,在用户眼里还是会多少加点分的.我们很开心的是easyui v1.3.4有自带defau ...

  2. Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

    Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现 ...

  3. Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图

    Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图 在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML ...

  4. Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

    Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程 ...

  5. 主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP

    原文:主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP 原文地址 http://www.codeguru.com/csharp/.net/net_asp/using-jso ...

  6. Asp.net MVC4.0(net4.5) 部署到window server 2003上的解决方案

    Asp.net MVC4.0(net4.5) 部署到window server 2003上的解决方案 最近做了一个Web项目,也没多想就用了Asp.net MVC4.0 ,MVC4.0默认的目标fra ...

  7. SNF快速开发平台3.0之-界面个性化配置+10种皮肤+7种菜单-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

    一.个性配置-首页:可以进行拖动保存配置,下次登录时就会按配置的进行加载 二.个人配置页面 7种菜单用户可自定义配置,和预览效果 10种皮肤自定义配置,和预览效果 皮肤和菜单可以随意组合-部分截图: ...

  8. 建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发

    框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性 ...

  9. Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

    Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framewo ...

随机推荐

  1. 如何在DOS下用C/C++ 编译器

    本文来自CSDN博客     ★★ 注意:以下适合 PC 环境 ★★   ●C/C++ 编译器需要的环境变数设定     古早以来,PC 上的 C 编译器,就需要两个环境变数:     LIB:这个环 ...

  2. c++对象内存布局

    这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的st ...

  3. 杂项一之js,<select>标签

    一.在aspx页面中实现 修改与删除页面的跳转 前台js部分: 在上部的js部分中写,根据传过来的id,来经行页面的跳转,并把id传过去 js部分就是实现了一个页面跳转的功能 (还有确认框confir ...

  4. 关于Silverlight调用天气预报接口问题

    问题:因Silverlight客户端不能直接调用webservice接口(外网天气接口),调用会出现跨域访问的问题,即使添加了跨域文件也不好使.解决方法如下 解决方法一:1.在服务端建立一个wcf服务 ...

  5. Nginx+Keepalived实现高可用站点

    Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat. corosync.pacemaker.但是它一般不会单独出现,而是与 ...

  6. Mysql 的MYISAM引擎拷贝出现异常——Incorrect information in file 'xxx.frm'

    MYISAM引擎有三个文件 .FRM    存储表结构 .MYD    存储数据 .MYI   存储索引 当复制表时,将这三个文件同时复制到指定目录下. 异常处理: 1. Incorrect info ...

  7. JS定时器实例解析

    在javascritp中,有两个关于定时器的专用函数. 分别为:1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...

  8. 拥抱ARM妹纸第二季 之 第二次 约会需要浪漫,这么大灯泡怎么弄?

    终于轮到俺的小穆出场啦.有请能让太阳也为之暗淡的小穆闪亮登场-,鼓掌吧,欢呼吧!-- ♪♪ We can burn brighter Than the sun ~~~ ♪♪ “谢谢---“ 唱的太棒啦 ...

  9. spring多数据源配置

    项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和hibernate的框架的 ...

  10. CHROME下去掉保存密码后输入框变成黄色背景样式

    之前没遇到过这种情况,现在打开这个页面后,手机号和密码都已经输入了,而且还显示的是黄色背景,清了下cookie,没有解决问题.请教了下大神,先把方法整理到这儿. 用代码审查看了input样式有如下样式 ...