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