ASP.NET MVC扩展之HtmlHelper辅助方法

什么是HtmlHelper辅助方法?

其实就是HtmlHelper类的扩展方法,如下所示:

namespace System.Web.Mvc.Html
{
    public static class FormExtensions//表单相关扩展方法,例如创建表单标签等。

    public static class InputExtensions//这里包含了所有input,例如:text,button,readiobutton等等。

    public static class LinkExtensions//链接相关方法

    public class MvcForm : IDisposable//与客户端控件无关

    public static class RenderPartialExtensions//这是输出PartialView

    public static class SelectExtensions//输出下拉框

    public static class TextAreaExtensions//输出多行文本框

    public static class ValidationExtensions//输出相关表单元素验证。
}

比如对于扩展类InputExtensions,MVC框架本身对此已有扩展:

namespace System.Web.Mvc.Html
{
    // Summary:
    //     Represents support for HTML input controls in an application.
    public static class InputExtensions
    {
         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name);
}
}

通过对HtmlHelper进行扩展来构建自己的HtmlHelper辅助方法

System.Web.Mvc.Html下的HtmlHelper只能完成大部分html控件的输出,有一些我们经常用到的东东它却没有,怎么办?自己动手吧~

在我们扩展之前,有个叫TagBuilder的类(生成标签)比较好用,你不必纠结于它的细节,只要大概知道他有那些方法就行:

   public TagBuilder(string tagName);
   public void AddCssClass(string value);//增加样式
   public void GenerateId(string name);//设置控件ID
   private string GetAttributesString();
   public void MergeAttribute(string key, string value);//设置属性值
   public void MergeAttribute(string key, string value, bool replaceExisting);
   public void MergeAttributes<TKey, TValue>(IDictionary<TKey, TValue> attributes);
   public void MergeAttributes<TKey, TValue>(IDictionary<TKey, TValue> attributes, bool replaceExisting);
   public void SetInnerText(string innerText);//设置显示文本
   public override string ToString();
   public string ToString(TagRenderMode renderMode);//输出控件html

现在可以开始扩展了!

A、扩展img标签

namespace System.Web.Mvc
{
    public static class ImageExtensions
    {
        public static string Image(this HtmlHelper helper, string id, string url, string alternateText)
        {
            return Image(helper, id, url, alternateText, null);
        }
        public static string Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
        {
            // 创建IMG标签
            var builder = new TagBuilder("img");

            // 增加ID属性
            builder.GenerateId(id);

            // 增加属性
            builder.MergeAttribute("src", url);
            builder.MergeAttribute("alt", alternateText);
            builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

            // 输出完整的img标签
            return builder.ToString(TagRenderMode.SelfClosing);
        }

    }
}

调用:@Html.Image("img1", http://img/111.jpg, "这是一张图片", new {border="4px"})

输出:<img id="img1" src="http://img/111.jpg" style="border:4px;" alt="这是一张图片"/>

B、扩展div标签

namespace System.Web.Mvc
{
    public static class DivExtensions
    {
        public static String Div(this HtmlHelper helper, String id, String content, String cssStyle, object htmlAttrs)
        {
            TagBuilder builder = new TagBuilder("div");
            //替换“.”为“_”
            builder.IdAttributeDotReplacement = "_";
            builder.GenerateId(id);       
            builder.MergeAttributes(new RouteValueDictionary(htmlAttrs));
            builder.AddCssClass(cssStyle);
            builder.InnerHtml=content;
            return builder.ToString(TagRenderMode.Normal);    //代表是双面标签
        }
    }
}

调用:

@Html.Div("MyDiv.1", "扩展方法", "MyClassStyle", new { style="border:solid red 1px;" })

输出:

<div id="MyDiv_1" class="MyClassStyle" style="border:solid red 1px;">扩展方法</div>

C、扩展Span标签

namespace System.Web.Mvc
{
    public static class SpanExtensions
    {
        public static string Span(this HtmlHelper helper, string id, string text, string css, object htmlAttributes)
        {
            //创意某一个Tag的TagBuilder
            var builder = new TagBuilder("span");

            //创建Id,注意要先设置IdAttributeDotReplacement属性后再执行GenerateId方法.
            builder.IdAttributeDotReplacement = "-";
            builder.GenerateId(id);
            

            //添加属性            
            builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

            //添加样式
            builder.AddCssClass(css);
            //或者用下面这句的形式也可以: builder.MergeAttribute("class", css);

            //添加内容,以下两种方式均可
            //builder.InnerHtml = text;
            builder.SetInnerText(text);

            //输出控件
            return builder.ToString(TagRenderMode.Normal);

        }
    }
}

调用:

@Html.Span("span.test", "使用TagBuilder帮助构建扩展方法", "ColorRed", new { style="font-size:15px;" })

输出:

<span id="span-test" class="ColorRed" style="font-size: 15px;">使用TagBuilder帮助构建扩展方法</span>

D、扩展ul、li标签

namespace System.Web.Mvc
{
    public static class UlLiExtensions
    {
        public static MvcHtmlString UlLi(this HtmlHelper helper, string[] listItems)

        {

            TagBuilder ulTag = new TagBuilder("ul");

            foreach (string item in listItems)

            {

                TagBuilder liTag = new TagBuilder("li");

                liTag.SetInnerText(item);

                ulTag.InnerHtml += liTag.ToString();

            }

            return new MvcHtmlString(ulTag.ToString());

        }

    }
}

调用:

@Html.List(new string[]{"上海","深圳","北京","广州"})

输出:

<ul> 
<li>上海</li> 
<li>深圳</li> 
<li>北京</li> 
<li>广州</li>  
</ul>

E、扩展截取字符串方法(当我们在显示某一个字段时,如果太长,显示的时候最好截取一下,最好是做成扩展方法来用)

namespace System.Web.Mvc
{
    public static class CutStringExtensions
    {
        public static string CutString(this  System.Web.Mvc.HtmlHelper helper, string content, int length)
        {
            if (content.Length > length)
            {
                return content.Substring(0, length) + "...";
            }
            else
            {
                return content;
            }
        }


    }
}

此处只是抛砖引玉,更多的用法要根据实际需求来进行开发~

posted @ 2014-07-02 00:34  掉进书洞里的猫  阅读(2575)  评论(4编辑  收藏  举报