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. uml的关联多重度

    UML中关联的多重度是指一个类的实例能够与另一个类的多少个实例相关联,这个“多少”被称为关联角色的多重度指定关联一端的多重度.也可以这样理解:在关联另一端的类的每个对象要求在本端的类必须有多 少个对象 ...

  2. c++11之右值引用

    本文大部分来自这里,并不是完全着行翻译,如有不明白的地方请参考原文. 在c++中,创建临时对象的开销对程序的影响一直很大,比如以下这个例子: String getName(){ return “Kia ...

  3. Excel 窗体控件属性

    常规 AutoLoad   (Excel) 打开工作簿时是否加载控件.(如果是 ActiveX   控件,则忽略.) Enabled(表单) 控件是否可以接收焦点并响应用户生成的事件. Locked( ...

  4. 修改ubuntu按电源键触发效果

    GUI内终端执行如下指令,或者加入开机启动脚本内 gsettings set org.gnome.settings-daemon.plugins.power button-power shutdown ...

  5. git 的使用(4)-git暂缓区工作区原理和修改删除等命令

    文章转载自:http://blog.csdn.net/think2me/article/details/39056379 博主说未经本人允许,不得转载,那就不贴了,拷贝关键部分作备忘 1. 暂存区是G ...

  6. win32开发基础

    收集的,正在学习... 跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4) ...

  7. IP进制站群原理

    百度搜索:“inurl:0×00”,会发现全是以八进制.十六进制形式显示的域名(如下图),当点击后,浏览器会自动将这些域名转换为十进制的ip.这种方式在黑帽圈目前挺火爆的,用于做长尾词排名,可以带来可 ...

  8. 【转】AOP知识点

    ref:http://www.diybloghome.com/prology/975.html 一.概念理解 老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming, ...

  9. 我开发了一个产品--Markdown Notes

    大家好,我开发了一个工具类软件产品--Markdown Notes,中文名是Markdown笔记.想写一篇有关它的文章,目的就是为了推广.推广.推广:) BTW:本文就是用这个工具所写的.

  10. Oracle 10g下载链接

    用迅雷下载: http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz http ...