學習MVC時候前端通常會用到HtmlHelper,使得前端編碼簡便很多。我們可能會經常用到htmlHelper中一些的EditorFor,LabelFor,ValiationMessageFor,
發現這些方法都是在System.Web.Mvc.Html 命名空間下定義的一些各類Extensions類。通過反編譯
namespace System.Web.Mvc.Html
{
public static class HtmlExtension
{
/// <summary>
/// 擴展radiobutton 列表
/// </summary>
/// <typeparam name="TModel">實體</typeparam>
/// <typeparam name="TValue">屬性</typeparam>
/// <param name="helper"></param>
/// <param name="expression">表達式</param>
/// <param name="items">數據列表</param>
/// <param name="column">每行顯示個數</param>
/// <param name="attributes">html屬性</param>
/// <returns></returns>
public static MvcHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, int column = 0, object attributes = null)
{
string raidobuttonStr = "";
BuildListTag(out raidobuttonStr, "radio", items, expression, column, attributes);
return MvcHtmlString.Create(raidobuttonStr);
}
/// <summary>
/// 擴展radiobutton 列表
/// </summary>
/// <typeparam name="TModel">實體</typeparam>
/// <typeparam name="TValue">屬性</typeparam>
/// <param name="helper"></param>
/// <param name="expression">表達式</param>
/// <param name="viewDataName">viewData數據列表名稱</param>
/// <param name="column">每行顯示個數</param>
/// <param name="attributes">屬性</param>
/// <returns></returns>
public static MvcHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string viewDataName, int column = 0, object attributes = null)
{
string raidobuttonStr = "";
var items = helper.ViewData[viewDataName] as List<SelectListItem>;
BuildListTag(out raidobuttonStr, "radio", items, expression, column, attributes);
return MvcHtmlString.Create(raidobuttonStr);
}
/// <summary>
/// 擴展radiobutton 列表
/// </summary>
/// <typeparam name="TModel">實體</typeparam>
/// <typeparam name="TValue">屬性</typeparam>
/// <param name="helper"></param>
/// <param name="expression">表達式</param>
/// <param name="items">數據列表</param>
/// <param name="column">每行顯示個數</param>
/// <param name="attributes">html屬性</param>
/// <returns></returns>
public static MvcHtmlString CheckBoxListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, int column = 0, object attributes = null)
{
string raidobuttonStr = "";
BuildListTag(out raidobuttonStr, "checkbox", items, expression, column, attributes);
return MvcHtmlString.Create(raidobuttonStr);
}
/// <summary>
/// 擴展radiobutton 列表
/// </summary>
/// <typeparam name="TModel">實體</typeparam>
/// <typeparam name="TValue">屬性</typeparam>
/// <param name="helper"></param>
/// <param name="expression">表達式</param>
/// <param name="viewDataName">viewData數據列表名稱</param>
/// <param name="column">每行顯示個數</param>
/// <param name="attributes">屬性</param>
/// <returns></returns>
public static MvcHtmlString CheckBoxListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string viewDataName, int column = 0, object attributes = null)
{
string raidobuttonStr = "";
var items = helper.ViewData[viewDataName] as List<SelectListItem>;
BuildListTag(out raidobuttonStr, "checkbox", items, expression, column, attributes);
return MvcHtmlString.Create(raidobuttonStr);
}
/// <summary>
/// 構造radioList或者checkBoxList標籤
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="raidobuttonStr">拼接的字符竄</param>
/// <param name="tag">標籤(checkbox or radio)</param>
/// <param name="expression">表達式</param>
/// <param name="items">數據列表</param>
/// <param name="column">每行顯示個數</param>
/// <param name="attributes">屬性</param>
private static void BuildListTag<TModel, TValue>(out string raidobuttonStr, string tag, IEnumerable<SelectListItem> items, Expression<Func<TModel, TValue>> expression, int column = 0, object attributes = null)
{
raidobuttonStr = "";
if (items != null && items.Any())
{
int count = 1;
///獲取表達式屬性名稱
var name = (expression.Body as MemberExpression).Member.Name;
foreach (var item in items)
{
TagBuilder raidobutton = new TagBuilder("input");
raidobutton.Attributes.Add("type", tag);
raidobutton.Attributes.Add("name", name);
raidobutton.Attributes.Add("value", item.Value);
if (item.Selected)
{
raidobutton.Attributes.Add("checked", "checked");
}
if (attributes != null)
{
raidobutton.MergeAttributes(new RouteValueDictionary(attributes));
}
raidobuttonStr += raidobutton.ToString(TagRenderMode.SelfClosing);
raidobuttonStr += item.Text;
raidobuttonStr += " ";
if (column == 1)
{
raidobuttonStr += "<br/>";
}
///根據每行顯示個數設置換行
else
{
if (count == column && column != 0)
{
raidobuttonStr += "<br/>";
}
}
count++;
}
}
}
}
}