扩展ASP.NET MVC HtmlHelper类

原文地址:Extending ASP.NET MVC HtmlHelper Class

在这篇帖子中我会使用一个示例演示扩展ASP.NET MVC HtmlHelper类,让它们可以在你的MVC视图中工作。这个示例中我会提供一个简单的方案生成Html表格。

HtmlHelper类

HtmlHelper类用于在ASP.NET MVC framework中帮助视图呈现html部分。

这个类提供了一些方法,你可以使用这些方法呈现html中的一些类型(textbox,checkbox等),或者html的一部分(如form)。ASP.NET MVC framework helper有这些内容:

  • Html.ActionLink()

  • Html.BeginForm()

  • Html.CheckBox()

  • Html.DropDownList()

  • Html.EndForm()

  • Html.Hidden()

  • Html.ListBox()

  • Html.Password()

  • Html.RadioButton()

  • Html.TextArea()

  • Html.TextBox()

比如说你要显示一个用name属性为myChkbox并且已经勾选的复选框,可以这样写:

<%=Html.CheckBox(“myChkbox”, true) %>

所有的html helper都是由扩展方法创建的,设在System.Web.Mvc.Html名称空间。

为HtmlHelper创建Html表格扩展

在本示例中我写了一个扩展方法,用于支持html表格的呈现。你可以修改它或者创建你自己的示例。

public   static   class  MVCHelpers
{
    
public   static   string  Table( this  HtmlHelper helper,  string  name, IList items, IDictionary < string object >  attributes)
    {
        
if  (items  ==   null   ||  items.Count  ==   0   ||   string .IsNullOrEmpty(name))
        {               
            
return   string .Empty;
        }

        
return  BuildTable(name, items, attributes);           
    }

    
private   static   string  BuildTable( string  name, IList items, IDictionary < string object >  attributes)
    {
        StringBuilder sb 
=   new  StringBuilder();
        BuildTableHeader(sb, items[
0 ].GetType());

        
foreach  (var item  in  items)
        {
            BuildTableRow(sb, item);
        }

        TagBuilder builder 
=   new  TagBuilder( " table " );
        builder.MergeAttributes(attributes);
        builder.MergeAttribute(
" name " , name);
        builder.InnerHtml 
=  sb.ToString();           
        
return  builder.ToString(TagRenderMode.Normal);
    }

    
private   static   void  BuildTableRow(StringBuilder sb,  object  obj)
    {
        Type objType 
=  obj.GetType();
        sb.AppendLine(
" \t<tr> " );
        
foreach  (var property  in  objType.GetProperties())
        {
            sb.AppendFormat(
" \t\t<td>{0}</td>\n " , property.GetValue(obj,  null ));
        }
        sb.AppendLine(
" \t</tr> " );
    }

    
private   static   void  BuildTableHeader(StringBuilder sb, Type p)
    {
        sb.AppendLine(
" \t<tr> " );
        
foreach  (var property  in  p.GetProperties())
        {
            sb.AppendFormat(
" \t\t<th>{0}</th>\n " , property.Name);
        }
        sb.AppendLine(
" \t</tr> " );
    }
}

你可以看到我如何利用扩展方法Table扩展HtmlHelper类。BuildTable方法是主要方法,它利用ASP.NET MVC TagBuilder类来创建table标签。你可以看到在我的示例用,我使用了反射,获取各项的属性列表,并且把这些属性名称作为表头,它们的值填充为表格单元格。

在视图中使用Html.Table扩展方法

如果你想使用这个自定义html helper,只需要做这些:

  • 在视图中用注册helper所在的名称空间:<%@ Import Namespace=”TaskList.Models” %>
  • 使用视图的Html属性中的Table方法,例如创建一个name属性为myTable,并使用视图中当前模型的例 子:<%=Html.Table(”myTable”, (IList)ViewData.Model, null) %>,注意Model如果不是IList,会出现异常。

总结

在这篇帖子中我介绍了HtmlHelper类,和如何为这个类创建一个简单的扩展方法。也可以通过创建你自己的类(如TableHelper)来扩展 HtmlHelper,你需要做的只是创建方法,并返回所要呈现的html。在我看来,使用扩展方法比较简单一点。

你可能感兴趣的:(asp.net)