为MVC3扩展CheckBoxList和RadioButtonList

在WebForm时代,CheckBoxList和RadioButtonList都非常容易实现。不得不承认,这两个控件还是非常实用的。

但是在MVC中并没有相关的支持,可能微软觉得没必要了吧,不过真的有人讲这个功能完成了。

代码摘抄自狼奔代码生成器。地址是:http://www.cnblogs.com/langben 有兴趣的可以研究下。

这个主要是为了收集代码。。

CheckBoxListHelper:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web;

using System.Web.Mvc;

using System.Linq.Expressions;

namespace Models

{

    public static class CheckBoxListHelper

    {

        /// <summary>

        /// CheckBox列表

        /// </summary>

        /// <param name="helper">辅助类</param>

        /// <param name="name">字段名称</param>

        /// <param name="selectList">集合</param>

        /// <returns></returns>

        public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList)

        {

            return CheckBoxList(helper, name, selectList, new { });

        }

        /// <summary>

        /// CheckBox列表

        /// </summary>

        /// <param name="helper">辅助类</param>

        /// <param name="name">字段名称</param>

        /// <param name="selectList">集合</param>

        /// <param name="htmlAttributes">html标签</param>

        /// <returns></returns>

        public static MvcHtmlString CheckBoxList(this HtmlHelper helper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes)

        {

            IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

            HashSet<string> set = new HashSet<string>();

            List<SelectListItem> list = new List<SelectListItem>();

            string selectedValues = Convert.ToString((selectList as SelectList).SelectedValue);



            if (!string.IsNullOrEmpty(selectedValues))

            {

                if (selectedValues.Contains(","))

                {



                    string[] tempStr = selectedValues.Split(',');



                    for (int i = 0; i < tempStr.Length; i++)

                    {

                        set.Add(tempStr[i]);

                    }

                }

                else

                {

                    set.Add(selectedValues);

                }

            }

            foreach (SelectListItem item in selectList)

            {

                item.Selected = (item.Value != null) ? set.Contains(item.Value) : set.Contains(item.Text);

                list.Add(item);

            }

            selectList = list;

            HtmlAttributes.Add("type", "checkbox");

            HtmlAttributes.Add("id", name);

            HtmlAttributes.Add("name", name);

            //HtmlAttributes.Add("style", "margin:0 0 0 10px;line-height:30px; vertical-align:-8px;border:none;");

            StringBuilder stringBuilder = new StringBuilder();

            foreach (SelectListItem selectItem in selectList)

            {



                IDictionary<string, object> newHtmlAttributes = HtmlAttributes.DeepCopy();

                newHtmlAttributes.Add("value", selectItem.Value);

                if (selectItem.Selected)

                {

                    newHtmlAttributes.Add("checked", "checked");

                }

                TagBuilder tagBuilder = new TagBuilder("input");

                tagBuilder.MergeAttributes<string, object>(newHtmlAttributes);

                string inputAllHtml = tagBuilder.ToString(TagRenderMode.SelfClosing);

                stringBuilder.AppendFormat(@"<label style=""margin:0 0 0 10px;""> {0}  {1}</label>",

                   inputAllHtml, selectItem.Text);

            }

            return MvcHtmlString.Create(stringBuilder.ToString());

        }

        private static IDictionary<string, object> DeepCopy(this IDictionary<string, object> ht)

        {

            Dictionary<string, object> _ht = new Dictionary<string, object>();

            foreach (var p in ht)

            {

                _ht.Add(p.Key, p.Value);

            }

            return _ht;

        }



    }

}

RadioButtonListHelper

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web;

using System.Web.Mvc;

using System.Linq.Expressions;

namespace Models

{

    public static class RadioButtonListHelper

    {

        /// <summary>

        /// Radio列表

        /// </summary>

        /// <param name="htmlHelper">辅助类</param>

        /// <param name="selectList">集合</param>

        /// <param name="htmlAttributes">html标签</param>

        /// <param name="isChecked">默认单选状态</param>

        /// <returns></returns>

        public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isChecked = false)

        {

            string name = ExpressionHelper.GetExpressionText(expression);

            return RadioButtonList(htmlHelper, name, selectList, htmlAttributes,isChecked);



        }





        /// <summary>

        /// Radio列表

        /// </summary>

        /// <param name="htmlHelper">辅助类</param>

        /// <param name="selectList">集合</param>

        /// <param name="isChecked">默认单选状态</param>

        /// <returns></returns>

        public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool isChecked = false)

        {

            string name = ExpressionHelper.GetExpressionText(expression);

            return RadioButtonList(htmlHelper, name, selectList, new { },isChecked);



        }



        /// <summary>

        /// Radio列表

        /// </summary>

        /// <param name="htmlHelper">辅助类</param>

        /// <param name="name">字段名称</param>

        /// <param name="selectList">集合</param>

        /// <param name="htmlAttributes">html标签</param>

        /// <param name="isChecked">默认单选状态</param>

        /// <returns></returns>

       public  static MvcHtmlString RadioButtonList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool isChecked = false)

        {

            IDictionary<string, object> HtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

            string defaultValue = string.Empty;

            if (htmlHelper.ViewData.Model != null)

            {

                if (!string.IsNullOrWhiteSpace(name))

                {

                    defaultValue = htmlHelper.ViewData.Eval(name) + "";



                }

                    isChecked = false;

               

            }

          



            StringBuilder str = new StringBuilder();

            foreach (SelectListItem item in selectList)

            {

                str.Append("<input ");

                if (item.Value == defaultValue)

                {

                    str.Append("checked='checked' ");



                }

                if (isChecked)

                {

                   

                    str.Append(" checked=true ");

                    isChecked = false;

                } 

                foreach (var bute in HtmlAttributes)

                {

                    str.Append(bute.Key + "=\"" + bute.Value);

                    

                }

               

                str.Append("\" id=\"" + item.Value + "\" type=\"radio\"  value=\"" + item.Value + "\" name=\"" + name + "\"/>");

                str.Append(item.Text);



            }





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

        }

    }

}

你可能感兴趣的:(RadioButton)