MVC 扩展RadioButtonListFor和CheckBoxListFor

复制代码
学习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 += "&nbsp;&nbsp;&nbsp;"; if (column == 1) { raidobuttonStr += "<br/>"; } ///根据每行显示个数设置换行 else { if (count == column && column != 0) { raidobuttonStr += "<br/>"; } } count++; } } } } }
复制代码

 

产品类型:@Html.CheckBoxListFor(m=>m.ProductTypeId, (SelectList)ViewData["ProductType"],3,null)  // 每行显示3个
产品类型:@Html.RadioButtonListFor(m => m.ProductTypeId, (SelectList)ViewData["ProductType"], 1, null)  每行显示1个
posted @   酒沉吟  阅读(337)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示