在我们做正常的MVC的开发中,一些基本的控件已经够用了,但是有时候我们需要用到库里面没有的一些控件,比如RadioButtonListFor和CheckBoxListFor这类的列表控件,在MVC库里面没提供,需要自己来扩展一下。我们通过MvcHtmlString扩展的控件,最终还是被转换为html标签的形式,所以扩展控件实质上还是拼标签。其中用到TagBuilder这个类,是mvc自带的生成标签字符窜的类,大家没事的时候搜一下看看具体用法。还有selectListItem这个类,主要包含键值属性和是否选中的属性 。以下代码只是根据个人思路来做的,仅供参考。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Web;
  6. using System.Web.Routing;
  7. using System.Web.UI;
  8.  
  9. namespace System.Web.Mvc.Html
  10. {
  11. public static class HtmlExtension
  12. {
  13. /// <summary>
  14. /// 扩展radiobutton 列表
  15. /// </summary>
  16. /// <typeparam name="TModel">实体</typeparam>
  17. /// <typeparam name="TValue">属性</typeparam>
  18. /// <param name="helper"></param>
  19. /// <param name="expression">表达式</param>
  20. /// <param name="items">数据列表</param>
  21. /// <param name="column">每行显示个数</param>
  22. /// <param name="attributes">html属性</param>
  23. /// <returns></returns>
  24. public static MvcHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, int column = , object attributes = null)
  25. {
  26. string raidobuttonStr = "";
  27. BuildListTag(out raidobuttonStr, "radio", items, expression, column, attributes);
  28. return MvcHtmlString.Create(raidobuttonStr);
  29. }
  30.  
  31. /// <summary>
  32. /// 扩展radiobutton 列表
  33. /// </summary>
  34. /// <typeparam name="TModel">实体</typeparam>
  35. /// <typeparam name="TValue">属性</typeparam>
  36. /// <param name="helper"></param>
  37. /// <param name="expression">表达式</param>
  38. /// <param name="viewDataName">viewData数据列表名称</param>
  39. /// <param name="column">每行显示个数</param>
  40. /// <param name="attributes">属性</param>
  41. /// <returns></returns>
  42. public static MvcHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string viewDataName, int column = , object attributes = null)
  43. {
  44. string raidobuttonStr = "";
  45. var items = helper.ViewData[viewDataName] as List<SelectListItem>;
  46. BuildListTag(out raidobuttonStr, "radio", items, expression, column, attributes);
  47. return MvcHtmlString.Create(raidobuttonStr);
  48. }
  49.  
  50. /// <summary>
  51. /// 扩展radiobutton 列表
  52. /// </summary>
  53. /// <typeparam name="TModel">实体</typeparam>
  54. /// <typeparam name="TValue">属性</typeparam>
  55. /// <param name="helper"></param>
  56. /// <param name="expression">表达式</param>
  57. /// <param name="items">数据列表</param>
  58. /// <param name="column">每行显示个数</param>
  59. /// <param name="attributes">html属性</param>
  60. /// <returns></returns>
  61. public static MvcHtmlString CheckBoxListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> items, int column = , object attributes = null)
  62. {
  63. string raidobuttonStr = "";
  64. BuildListTag(out raidobuttonStr, "checkbox", items, expression, column, attributes);
  65. return MvcHtmlString.Create(raidobuttonStr);
  66. }
  67.  
  68. /// <summary>
  69. /// 扩展radiobutton 列表
  70. /// </summary>
  71. /// <typeparam name="TModel">实体</typeparam>
  72. /// <typeparam name="TValue">属性</typeparam>
  73. /// <param name="helper"></param>
  74. /// <param name="expression">表达式</param>
  75. /// <param name="viewDataName">viewData数据列表名称</param>
  76. /// <param name="column">每行显示个数</param>
  77. /// <param name="attributes">属性</param>
  78. /// <returns></returns>
  79. public static MvcHtmlString CheckBoxListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string viewDataName, int column = , object attributes = null)
  80. {
  81. string raidobuttonStr = "";
  82. var items = helper.ViewData[viewDataName] as List<SelectListItem>;
  83. BuildListTag(out raidobuttonStr, "checkbox", items, expression, column, attributes);
  84. return MvcHtmlString.Create(raidobuttonStr);
  85. }
  86.  
  87. /// <summary>
  88. /// 构造radioList或者checkBoxList标签
  89. /// </summary>
  90. /// <typeparam name="TModel"></typeparam>
  91. /// <typeparam name="TValue"></typeparam>
  92. /// <param name="raidobuttonStr">拼接的字符窜</param>
  93. /// <param name="tag">标签(checkbox or radio)</param>
  94. /// <param name="expression">表达式</param>
  95. /// <param name="items">数据列表</param>
  96. /// <param name="column">每行显示个数</param>
  97. /// <param name="attributes">属性</param>
  98. private static void BuildListTag<TModel, TValue>(out string raidobuttonStr, string tag, IEnumerable<SelectListItem> items, Expression<Func<TModel, TValue>> expression, int column = , object attributes = null)
  99. {
  100. raidobuttonStr = "";
  101. if (items != null && items.Any())
  102. {
  103. int count = ;
  104. ///获取表达式属性名称
  105. var name = (expression.Body as MemberExpression).Member.Name;
  106. foreach (var item in items)
  107. {
  108. TagBuilder raidobutton = new TagBuilder("input");
  109. raidobutton.Attributes.Add("type", tag);
  110. raidobutton.Attributes.Add("name", name);
  111. raidobutton.Attributes.Add("value", item.Value);
  112. if (item.Selected)
  113. {
  114. raidobutton.Attributes.Add("checked", "checked");
  115. }
  116. if (attributes != null)
  117. {
  118. raidobutton.MergeAttributes(new RouteValueDictionary(attributes));
  119. }
  120.  
  121. raidobuttonStr += raidobutton.ToString(TagRenderMode.SelfClosing);
  122. raidobuttonStr += item.Text;
  123. raidobuttonStr += "&nbsp;&nbsp;&nbsp;";
  124.  
  125. if (column == )
  126. {
  127. raidobuttonStr += "<br/>";
  128. }
  129. ///根据每行显示个数设置换行
  130. else
  131. {
  132. if (count == column && column != )
  133. {
  134. raidobuttonStr += "<br/>";
  135. }
  136. }
  137. count++;
  138. }
  139.  
  140. }
  141.  
  142. }
  143. }
  144. }

下面是调用的方法

控制器里面代码:

  1. var list = new List<SelectListItem>();
  2. list.Add(new SelectListItem() { Text = "aaa", Value = "", Selected = false });
  3. list.Add(new SelectListItem() { Text = "bbb", Value = "", Selected = false });
  4. list.Add(new SelectListItem() { Text = "ccc", Value = "", Selected = false });
  5. list.Add(new SelectListItem() { Text = "ddd", Value = "", Selected = true });
  6. ViewBag.list = list;

页面上的代码(两种方式):

(1)

  1. @{
  2. var list = ViewBag.list as List<SelectListItem>;
  3.  
  4. }
  5. @Html.CheckBoxListFor(p=>p.AccountCode,list,3)//@Html.RadioButtonListFor(p=>p.AccountCode,list,3)

(2)

  1. @Html.CheckBoxListFor(p=>p.AccountCode,"list",3)//@Html.RadioButtonListFor(p=>p.AccountCode,"list",3)

其中的3代表每行显示3个,可以改为其他值,默认是显示一行

大致的代码就这么多,有不懂的或者有更好想法的,可以把代码贴在回复下面。

扩展RadioButtonListFor和CheckBoxListFor的更多相关文章

  1. MVC 扩展RadioButtonListFor和CheckBoxListFor

    学习MVC时候前端通常会用到HtmlHelper,使得前端编码简便很多.我们可能会经常用到htmlHelper中一些的EditorFor,LabelFor,ValiationMessageFor, 发 ...

  2. MVC扩展HtmlHelper,加入RadioButtonList、CheckBoxList、DropdownList

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions ...

  3. mvc给html扩展方法:

    mvc给html扩展方法: 注意:扩展方法和所在的类都必须是 public static如果在页面直接使用新扩展的方法,需要web.config里把Web.Helper名称命名空间加上,页面才能访问到 ...

  4. 在ASP.NET MVC下扩展一个带验证的RadioButtonList

    在ASP.NET MVC4中,HtmlHelper为我们提供了Html.RadioButton()方法用来显示Radio Button单选按钮.如果想显示一组单选按钮,通常的做法是遍历一个集合把每个单 ...

  5. Asp.net Boilerplate之AbpSession扩展

    当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...

  6. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  7. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  8. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  9. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

随机推荐

  1. java中异常抛出后代码还会继续执行吗

    今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element){ i ...

  2. 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的

    感兴趣的同学可以关注这个翻译项目 . 我的博客原文 和 我的Github 前段时间翻译的Spring MVC官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...

  3. C#实现微信开发前奏

    不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,链接给你   http://mp.weixin.qq.com/debug/cgi ...

  4. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  5. zip函数-Python 3

    zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表. zip函数在获取数据后,生成字典(dict)时比较好用. for examples: # Code based on P ...

  6. OS存储管理——FIFO,LRU,OPT命中率

    课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...

  7. CXF:根据werservice代码生成WSDL(转)

    原文:http://hongyegu.iteye.com/blog/619147,谢谢! import org.apache.cxf.tools.java2ws.JavaToWS; import ne ...

  8. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  9. poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

    /** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...

  10. struts2杂记(一)——使用doubleSelect

    一.前言 这段时间忙的要死,做项目,学框架,时间根本不够用,只能尽量抽出时间记录自己学过的东西. 1.1.doubleSelect 在之前学习中,我们使用过二级列表,相信很多人都理解其原理,在stru ...