爱上MVC~为CheckBoxFor和RadioButtonFor加个扩展方法吧(希望MVC5把这方法收纳——呵呵)

简介:

说在前

我都是喜欢把问题复杂化,还有总是喜欢把问题简单化,偷懒化,这也需就是一个程序员的追求吧,呵呵。

我不太喜欢重复的东西,当你看到页面上有一个以上相同的代码时,那可以说,你的代码有重构的余地,应该考虑重构了,今天看了以前同事的博客,写了关于DropDownList的用法,如何将集合数据绑定到下拉列表框上,讲的不错,但最后在说checkbox和radiobutton时,我感觉有点重复了,我说的是代码重复了,还有就是代码复杂化了,就是说,我再使用集合来产生checkbox和radiobutton时,代码有些复杂了,这不是我们希望看到的,所以,我觉得有必要把它重构一下,为mvc加两个扩展方法吧,呵呵。

做在后

DropDownListFor的方法签名做的不错,很面向对象,很简洁,但不知不何,checkbox和radiobutton确没有这样的重载,呵呵

        public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList);
        public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, IDictionary<string, object> htmlAttributes);
        public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes);
        public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel);
        public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes);
        public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, object htmlAttributes);

对于checkbox和radiobutton它们只有简单的几个重载,没有对集合的支持,所以,我的这次代码扩展,主要是针对集合来说的,看方法签名:

下面看一下原代码,它直接写在了System.Web.Mvc命名空间下,这更说明我是对微软MVC的一个扩展,希望MVC5出来时,可以把这些都集成进去,呵呵

#region 单选框和复选框的扩展
        /// <summary>
        /// 复选框,selValue为选中项
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="selectList"></param>
        /// <param name="selValue"></param>
        /// <returns></returns>
        public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, IEnumerable<string> selValue)
        {
            return CheckBoxAndRadioFor<object, string>(name, selectList, false, selValue);
        }
        public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, string selValue)
        {
            return CheckBox(htmlHelper, name, selectList, new List<string> { selValue });

        }
        /// <summary>
        /// 复选框
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="selectList"></param>
        /// <returns></returns>
        public static MvcHtmlString CheckBoxFor(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList)
        {
            return CheckBox(htmlHelper, name, selectList, new List<string>());
        }
        /// <summary>
        /// 根据列表输出checkbox
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="htmlHelper"></param>
        /// <param name="expression"></param>
        /// <param name="selectList"></param>
        /// <returns></returns>
        public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
        {
            return CheckBoxFor(htmlHelper, expression, selectList, null);
        }

        /// <summary>
        ///  根据列表输出checkbox,selValue为默认选中的项
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="htmlHelper"></param>
        /// <param name="expression"></param>
        /// <param name="selectList"></param>
        /// <param name="selValue"></param>
        /// <returns></returns>
        public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string selValue)
        {
            string name = ExpressionHelper.GetExpressionText(expression);
            return CheckBoxAndRadioFor<TModel, TProperty>(name, selectList, false, new List<string> { selValue });
        }
        /// <summary>
        /// 输出单选框和复选框
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="expression"></param>
        /// <param name="selectList"></param>
        /// <param name="isRadio"></param>
        /// <param name="selValue"></param>
        /// <returns></returns>
        static MvcHtmlString CheckBoxAndRadioFor<TModel, TProperty>(
            string name,
            IEnumerable<SelectListItem> selectList,
            bool isRadio,
            IEnumerable<string> selValue)
        {
            StringBuilder str = new StringBuilder();
            int c = 0;
            string check, activeClass;
            string type = isRadio ? "Radio" : "checkbox";

            foreach (var item in selectList)
            {
                c++;
                if (selValue != null && selValue.Contains(item.Value))
                {
                    check = "checked='checked'";
                    activeClass = "style=color:red";
                }
                else
                {
                    check = string.Empty;
                    activeClass = string.Empty;
                }
                str.AppendFormat("<span><input type='{3}' value='{0}' name={1} id={1}{2} " + check + "/>", item.Value, name, c, type);
                str.AppendFormat("<label for='{0}{1}' {3}>{2}</lable></span>", name, c, item.Text, activeClass);

            }
            return MvcHtmlString.Create(str.ToString());
        }


        public static MvcHtmlString RadioButton(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, IEnumerable<string> selValue)
        {
            return CheckBoxAndRadioFor<object, string>(name, selectList, true, selValue);
        }
        /// <summary>
        /// 单选按钮组,seletList为选中项
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="selectList"></param>
        /// <param name="selValue"></param>
        /// <returns></returns>
        public static MvcHtmlString RadioButton(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, string selValue)
        {
            return RadioButton(htmlHelper, name, selectList, new List<string> { selValue });
        }
        /// <summary>
        /// 单选按钮组
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="selectList"></param>
        /// <returns></returns>
        public static MvcHtmlString RadioButton(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList)
        {
            return RadioButton(htmlHelper, name, selectList, new List<string>());
        }
        /// <summary>
        ///  根据列表输出radiobutton
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="htmlHelper"></param>
        /// <param name="expression"></param>
        /// <param name="selectList"></param>
        /// <returns></returns>
        public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
        {
            return RadioButtonFor(htmlHelper, expression, selectList, new List<string>());
        }
        public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, IEnumerable<string> selValue)
        {
            string name = ExpressionHelper.GetExpressionText(expression);
            return CheckBoxAndRadioFor<TModel, TProperty>(name, selectList, true, selValue);
        }
        /// <summary>
        /// 根据列表输出radiobutton,selValue为默认选中的项
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="htmlHelper"></param>
        /// <param name="expression"></param>
        /// <param name="selectList"></param>
        /// <param name="selValue"></param>
        /// <returns></returns>
        public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string selValue)
        {
            return RadioButtonFor(htmlHelper, expression, selectList, new List<string> { selValue });
        }
        #endregion

本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC~为CheckBoxFor和RadioButtonFor加个扩展方法吧(希望MVC5把这方法收纳——呵呵),如需转载请自行联系原博主。

目录
相关文章
|
设计模式 JSON 前端开发
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
53 0
|
前端开发 Java 索引
Spring MVC Controller 方法参数 Map 的实现类是什么?
问题 题主问题描述如下: 在SpringBoot中,Controller的参数中有Map接口类型的,请问他的实现类是什么? 突发奇想,在SpringBoot中,Controller的参数中有Map接口类型的
393 0
Spring MVC Controller 方法参数 Map 的实现类是什么?
|
前端开发 Java 程序员
Spring MVC 框架搭建配置方法及详解
Spring MVC 框架搭建配置方法及详解
Spring MVC 框架搭建配置方法及详解
|
前端开发 Java Spring
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(下)
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(下)
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(下)
|
前端开发 Java Spring
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(上)
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(上)
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(上)
|
前端开发 Java Apache
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(中)
HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】(中)
|
前端开发 Java Spring
Spring MVC的Controller接受请求方式以及编写请求处理方法
标签中的内容:创建register.jsp代码: 复制代码<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 注册画面<form action="${pageContext.
674 0
|
前端开发 数据库 存储
MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用
原文:MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用   摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识。 第二阶段11~20篇将会侧重于专题的讲解,一篇文章解决一个实际问题。
1306 0
|
前端开发 C#
C# MVC的一种高效分页的html方法
首先创建一个html的扩展方法,这个方法是万能的,可以直接拿到您的项目中使用:   //主要就是输出分页的超级链接的标签 //自定义分页Helper扩展 public static HtmlString ShowPageNavigate(this Htm...
1653 0