擴展RadioButtonListFor和CheckBoxListFor

         在咱們作正常的MVC的開發中,一些基本的控件已經夠用了,可是有時候咱們須要用到庫裏面沒有的一些控件,好比RadioButtonListFor和CheckBoxListFor這類的列表控件,在MVC庫裏面沒提供,須要本身來擴展一下。咱們經過MvcHtmlString擴展的控件,最終仍是被轉換爲html標籤的形式,因此擴展控件實質上仍是拼標籤。其中用到TagBuilder這個類,是mvc自帶的生成標籤字符竄的類,你們沒事的時候搜一下看看具體用法。還有selectListItem這個類,主要包含鍵值屬性和是否選中的屬性 。如下代碼只是根據我的思路來作的,僅供參考。html

         

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 += "&nbsp;&nbsp;&nbsp;";

                    if (column == 1)
                    {
                        raidobuttonStr += "<br/>";
                    }
                    ///根據每行顯示個數設置換行
                    else
                    {
                        if (count == column && column != 0)
                        {
                            raidobuttonStr += "<br/>";
                        }
                    }
                    count++;
                }

            }



        }
    }
}

下面是調用的方法   express

   控制器裏面代碼:  mvc

       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;

  頁面上的代碼(兩種方式):ui

  (1)this

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

 (2)spa

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

其中的3表明每行顯示3個,能夠改成其餘值,默認是顯示一行code

 

 

大體的代碼就這麼多,有不懂的或者有更好想法的,能夠把代碼貼在回覆下面。htm

相關文章
相關標籤/搜索