在我們做正常的MVC的開發中,一些基本的控件已經夠用了,但是有時候我們需要用到庫里面沒有的一些控件,比如RadioButtonListFor和CheckBoxListFor這類的列表控件,在MVC庫里面沒提供,需要自己來擴展一下。我們通過MvcHtmlString擴展的控件,最終還是被轉換為html標簽的形式,所以擴展控件實質上還是拼標簽。其中用到TagBuilder這個類,是mvc自帶的生成標簽字符竄的類,大家沒事的時候搜一下看看具體用法。還有selectListItem這個類,主要包含鍵值屬性和是否選中的屬性 。以下代碼只是根據個人思路來做的,僅供參考。
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Web; using System.Web.Routing; using System.Web.UI; 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++; } } } } }
下面是調用的方法
控制器里面代碼:
var list = new List<SelectListItem>(); list.Add(new SelectListItem() { Text = "aaa", Value = "1", Selected = false }); list.Add(new SelectListItem() { Text = "bbb", Value = "2", Selected = false }); list.Add(new SelectListItem() { Text = "ccc", Value = "3", Selected = false }); list.Add(new SelectListItem() { Text = "ddd", Value = "4", Selected = true }); ViewBag.list = list;
頁面上的代碼(兩種方式):
(1)
@{
var list = ViewBag.list as List<SelectListItem>;
}
@Html.CheckBoxListFor(p=>p.AccountCode,list,3)//@Html.RadioButtonListFor(p=>p.AccountCode,list,3)
(2)
@Html.CheckBoxListFor(p=>p.AccountCode,"list",3)//@Html.RadioButtonListFor(p=>p.AccountCode,"list",3)
其中的3代表每行顯示3個,可以改為其他值,默認是顯示一行
大致的代碼就這么多,有不懂的或者有更好想法的,可以把代碼貼在回復下面。
