擴展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<stringobject> 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<stringobject> 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。在我看來,使用擴展方法比較簡單一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章