代码改变世界

(原创)利用扩展方法,给 IEnumerable<T> 增加一个生成 Html 的 select 标签的方法,不用 C# 中的反射技术

2011-06-03 16:35  音乐让我说  阅读(370)  评论(0编辑  收藏  举报

不知道园子里有没有人写过这样代码,反正我刚才写了一个,我以人格担保是原创,不是转载。


代码胜过一切说明:

HtmlSelectExtender.cs

#region 生成 HTML 的 Select 标签

        /// <summary>
        /// 生成 HTML 的 Select 标签
        /// </summary>
        /// <param name="dataSource">数据源</param>
        /// <param name="id">Select 标签的 Id</param>
        /// <param name="name">Select 标签的 Name</param>
        /// <param name="funcInner">获取内部的调用</param>
        /// <returns></returns>
        public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, string id, string name, Func<T, HtmlOptionResult> funcInner)
        {
            return GenerateHtmlSelect(dataSource, id, name, funcInner);
        }

        /// <summary>
        /// 生成 HTML 的 Select 标签
        /// </summary>
        /// <param name="dataSource">数据源</param>
        /// <param name="id">Select 标签的 Id</param>
        /// <param name="name">Select 标签的 Name</param>
        /// <param name="funcInner">获取内部的调用</param>
        /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
        /// <returns></returns>
        public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, string id, string name, Func<T, HtmlOptionResult> funcInner, string otherHtmlAttributes)
        {
            return GenerateHtmlSelect(dataSource, id, name, funcInner, null, null, otherHtmlAttributes);
        }

        /// <summary>
        /// 生成 HTML 的 Select 标签
        /// </summary>
        /// <param name="dataSource">数据源</param>
        /// <param name="id">Select 标签的 Id</param>
        /// <param name="name">Select 标签的 Name</param>
        /// <param name="funcInner">获取内部的调用</param>
        /// <param name="initOptionText">初始化 Option 上显示的文本</param>
        /// <param name="initOptionValue">初始化 Option 上显示的值</param>
        /// <returns></returns>
        public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, string id, string name, Func<T, HtmlOptionResult> funcInner, string initOptionText, string initOptionValue)
        {
            return GenerateHtmlSelect(dataSource, id, name, funcInner, initOptionText, initOptionValue, null);
        }

        /// <summary>
        /// 生成 HTML 的 Select 标签
        /// </summary>
        /// <param name="dataSource">数据源</param>
        /// <param name="id">Select 标签的 Id</param>
        /// <param name="name">Select 标签的 Name</param>
        /// <param name="funcInner">获取内部的调用</param>
        /// <param name="initOptionText">初始化 Option 上显示的文本</param>
        /// <param name="initOptionValue">初始化 Option 上显示的值</param>
        /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
        /// <returns></returns>
        public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, string id, string name, Func<T, HtmlOptionResult> funcInner, string initOptionText, string initOptionValue, string otherHtmlAttributes)
        {
            if (dataSource == null)
            {
                throw new ArgumentNullException("dataSource");
            }
            if (id == null)
            {
                throw new ArgumentNullException("id");
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            StringBuilder textAppend = new StringBuilder();
            textAppend.AppendFormat("<select id=\"" + id + "\" name=\"" + name + "\"{0}>", string.IsNullOrEmpty(otherHtmlAttributes) ? string.Empty : " " + otherHtmlAttributes);
            if (initOptionText != null)
            {
                textAppend.AppendFormat("<option {0}>{1}</option>", initOptionValue != null ? "value=\"" + initOptionValue + "\"" : string.Empty, initOptionText);
            }
            HtmlOptionResult optionResult;
            foreach (var item in dataSource)
            {
                optionResult = funcInner(item);
                textAppend.AppendFormat("<option value=\"{0}\"{2}>{1}</option>", optionResult.OptionValue, optionResult.OptionText, optionResult.OptionSelected ? " selected=\"selected\"" : string.Empty);
            }
            textAppend.Append("</select>");
            return textAppend.ToString();
        }

        #endregion

HtmlOptionResult.cs

namespace HtmlSelectWebApp
{
    public class HtmlOptionResult
    {
        public HtmlOptionResult(string optionText, string optionValue)
            : this(optionText, optionValue, false)
        {

        }
        public HtmlOptionResult(string optionText, string optionValue, bool optionSelected)
        {
            this.OptionText = optionText;
            this.OptionValue = optionValue;
            this.OptionSelected = optionSelected;
        }

        public string OptionText
        {
            get;
            set;
        }
        public string OptionValue
        {
            get;
            set;
        }
        public bool OptionSelected
        {
            get;
            set;
        }
    }
}

Department.cs

namespace HtmlSelectWebApp
{
    public class Department
    {
        public Department()
        {

        }

        public Department(int id, string departName, string remark)
        {
            this.Id = id;
            this.DepartName = departName;
            this.Remark = remark;
        }

        public int Id
        {
            get;
            set;
        }

        public string DepartName
        {
            get;
            set;
        }

        public string Remark
        {
            get;
            set;
        }

    }
}

Default.aspx

    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="ltDepartment" runat="server" />
    </div>
    </form>

Default.aspx.cs

using System;
using System.Collections.Generic;

namespace HtmlSelectWebApp
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                List<Department> allDepart = GetAllDepartment();
                int? selectedValue = 3;
                this.ltDepartment.Text = allDepart.GenerateHtmlSelect<Department>("ddlDepart", "ddlDepart", null, delegate(Department item)
                {
                    return new HtmlOptionResult(item.DepartName, item.Id.ToString(), selectedValue.HasValue && item.Id == selectedValue.Value);
                });
            }
        }

        public static List<Department> GetAllDepartment()
        {
            return new List<Department>()
            {
                new Department(1, "电脑信息部", "电脑信息部是一个很优秀的部门"),
                new Department(2, "财务部", "无"),
                new Department(3, "人力资源部", "无"),
                new Department(4, "采购部", "无"),
                new Department(5, "运营部", "无"),
                new Department(6, "公关部", "无")
            };
        }
    }
}

 

最新更新如下:

View Code
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Text;
  6 
  7 namespace TestIIS.WebFormsUI.App_Codes
  8 {
  9     public static class HtmlSelectExtensions
 10     {
 11         #region 生成 HTML 的 Select 标签
 12 
 13         #region 通过 Func 得到模型的 Text、Value
 14 
 15         /// <summary>
 16         /// 生成 HTML 的 Select 标签 
 17         /// </summary>
 18         /// <typeparam name="T"></typeparam>
 19         /// <param name="dataSource">数据源</param>
 20         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
 21         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
 22         /// <param name="selectedValue">选中的值</param>
 23         /// <returns></returns>
 24         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string selectedValue)
 25         {
 26             return GenerateHtmlSelect(dataSource, funText, funValue, selectedValue, null, null, (HtmlOptionResult)null, null);
 27         }
 28 
 29         /// <summary>
 30         /// 生成 HTML 的 Select 标签 
 31         /// </summary>
 32         /// <typeparam name="T"></typeparam>
 33         /// <param name="dataSource">数据源</param>
 34         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
 35         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
 36         /// <param name="selectedValue">选中的值</param>
 37         /// <param name="id">Select 标签的 Id,可为空</param>
 38         /// <param name="name">Select 标签的 name,可为空</param>
 39         /// <returns></returns>
 40         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name)
 41         {
 42             return GenerateHtmlSelect(dataSource, funText, funValue, selectedValue, id, name, (HtmlOptionResult)null, null);
 43         }
 44 
 45         /// <summary>
 46         /// 生成 HTML 的 Select 标签 
 47         /// </summary>
 48         /// <typeparam name="T"></typeparam>
 49         /// <param name="dataSource">数据源</param>
 50         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
 51         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
 52         /// <param name="selectedValue">选中的值</param>
 53         /// <param name="id">Select 标签的 Id,可为空</param>
 54         /// <param name="name">Select 标签的 name,可为空</param>
 55         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
 56         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
 57         /// <returns></returns>
 58         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, string initOptionText, string initOptionValue)
 59         {
 60             return GenerateHtmlSelect(dataSource, funText, funValue, selectedValue, id, name, initOptionText, initOptionValue, null);
 61         }
 62 
 63         /// <summary>
 64         /// 生成 HTML 的 Select 标签 
 65         /// </summary>
 66         /// <typeparam name="T"></typeparam>
 67         /// <param name="dataSource">数据源</param>
 68         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
 69         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
 70         /// <param name="selectedValue">选中的值</param>
 71         /// <param name="id">Select 标签的 Id,可为空</param>
 72         /// <param name="name">Select 标签的 name,可为空</param>
 73         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
 74         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
 75         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
 76         /// <returns></returns>
 77         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, string initOptionText, string initOptionValue, string otherHtmlAttributes)
 78         {
 79             return GenerateHtmlSelect(dataSource, funText, funValue, selectedValue, id, name, new HtmlOptionResult(initOptionText, initOptionValue, IsEqualsOrContains(initOptionValue, selectedValue)), otherHtmlAttributes);
 80         }
 81 
 82         /// <summary>
 83         /// 生成 HTML 的 Select 标签 
 84         /// </summary>
 85         /// <typeparam name="T"></typeparam>
 86         /// <param name="dataSource">数据源</param>
 87         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
 88         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
 89         /// <param name="selectedValue">选中的值</param>
 90         /// <param name="id">Select 标签的 Id,可为空</param>
 91         /// <param name="name">Select 标签的 name,可为空</param>
 92         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
 93         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
 94         /// <returns></returns>
 95         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
 96         {
 97             return GenerateHtmlSelect(dataSource, t => GetHtmlOptionResultByFuncParams(t, funText, funValue, selectedValue), id, name, initOption, otherHtmlAttributes);
 98         }
 99 
100         #endregion
101 
102         #region 通过 HtmlOptionResult 得到模型的 Text、Value
103 
104         /// <summary> 
105         /// 生成 HTML 的 Select 标签 
106         /// </summary> 
107         /// <param name="dataSource">数据源</param> 
108         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
109         /// <returns></returns>
110         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner)
111         {
112             return GenerateHtmlSelect(dataSource, funcInner, null, null);
113         }
114 
115         /// <summary> 
116         /// 生成 HTML 的 Select 标签 
117         /// </summary> 
118         /// <param name="dataSource">数据源</param>
119         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
120         /// <param name="id">Select 标签的 Id,可为 null</param>
121         /// <param name="name">Select 标签的 Name,可为 null</param>
122         /// <returns></returns>
123         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name)
124         {
125             return GenerateHtmlSelect(dataSource, funcInner, id, name, (string)null);
126         }
127 
128         /// <summary> 
129         /// 生成 HTML 的 Select 标签 
130         /// </summary> 
131         /// <param name="dataSource">数据源</param> 
132         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
133         /// <param name="id">Select 标签的 Id,可为空</param>
134         /// <param name="name">Select 标签的 Name,可为空</param>
135         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param> 
136         /// <returns></returns>
137         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name, string otherHtmlAttributes)
138         {
139             return GenerateHtmlSelect(dataSource, funcInner, id, name, null, otherHtmlAttributes);
140         }
141 
142         /// <summary> 
143         /// 生成 HTML 的 Select 标签 
144         /// </summary> 
145         /// <param name="dataSource">数据源</param> 
146         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
147         /// <param name="id">Select 标签的 Id,可为 null</param>
148         /// <param name="name">Select 标签的 Name,可为 null</param>
149         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
150         /// <returns></returns> 
151         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption)
152         {
153             return GenerateHtmlSelect(dataSource, funcInner, id, name, initOption, null);
154         }
155 
156         /// <summary> 
157         /// 生成 HTML 的 Select 标签
158         /// </summary> 
159         /// <param name="dataSource">数据源</param>
160         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
161         /// <param name="id">Select 标签的 Id,可为 null</param>
162         /// <param name="name">Select 标签的 Name,可为 null</param>
163         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
164         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param> 
165         /// <returns></returns> 
166         public static string GenerateHtmlSelect<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
167         {
168             if (dataSource == null)
169             {
170                 throw new ArgumentNullException("dataSource");
171             }
172             if (funcInner == null)
173             {
174                 throw new ArgumentNullException("funcInner");
175             }
176             StringBuilder textAppend = new StringBuilder();
177             GenerateHtmlSelectBeginTag(id, name, otherHtmlAttributes, textAppend);
178             GenerateHtmlSelectCoreOption(initOption, textAppend);
179             foreach (var item in dataSource)
180             {
181                 GenerateHtmlSelectCoreOption(funcInner(item), textAppend);
182             }
183             GenerateHtmlSelectEndTag(textAppend);
184             return textAppend.ToString();
185         }
186 
187         #endregion
188 
189         #endregion
190 
191         #region 生成 HTML 的 Select 标签(带 multiple)
192 
193         #region 通过 Func 得到模型的 Text、Value
194 
195         /// <summary>
196         /// 生成 HTML 的 Select 标签(带 multiple)
197         /// </summary>
198         /// <typeparam name="T"></typeparam>
199         /// <param name="dataSource">数据源</param>
200         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
201         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
202         /// <param name="selectedValue">选中的值</param>
203         /// <returns></returns>
204         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue)
205         {
206             return GenerateHtmlSelectMultiple(dataSource, funText, funValue, selectedValue, null, null, (HtmlOptionResult)null, null);
207         }
208 
209         /// <summary>
210         /// 生成 HTML 的 Select 标签(带 multiple)
211         /// </summary>
212         /// <typeparam name="T"></typeparam>
213         /// <param name="dataSource">数据源</param>
214         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
215         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
216         /// <param name="selectedValue">选中的值</param>
217         /// <param name="id">Select 标签的 Id,可为空</param>
218         /// <param name="name">Select 标签的 name,可为空</param>
219         /// <returns></returns>
220         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name)
221         {
222             return GenerateHtmlSelectMultiple(dataSource, funText, funValue, selectedValue, id, name, (HtmlOptionResult)null, null); 
223         }
224 
225         /// <summary>
226         /// 生成 HTML 的 Select 标签(带 multiple)
227         /// </summary>
228         /// <typeparam name="T"></typeparam>
229         /// <param name="dataSource">数据源</param>
230         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
231         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
232         /// <param name="selectedValue">选中的值</param>
233         /// <param name="id">Select 标签的 Id,可为空</param>
234         /// <param name="name">Select 标签的 name,可为空</param>
235         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
236         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
237         /// <returns></returns>
238         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name, string initOptionText, string initOptionValue)
239         {
240             return GenerateHtmlSelectMultiple(dataSource, funText, funValue, selectedValue, id, name, initOptionText, initOptionValue, null); 
241         }
242 
243         /// <summary>
244         /// 生成 HTML 的 Select 标签(带 multiple)
245         /// </summary>
246         /// <typeparam name="T"></typeparam>
247         /// <param name="dataSource">数据源</param>
248         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
249         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
250         /// <param name="selectedValue">选中的值</param>
251         /// <param name="id">Select 标签的 Id,可为空</param>
252         /// <param name="name">Select 标签的 name,可为空</param>
253         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
254         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
255         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
256         /// <returns></returns>
257         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name, string initOptionText, string initOptionValue, string otherHtmlAttributes)
258         {
259             return GenerateHtmlSelectMultiple(dataSource, funText, funValue, selectedValue, id, name, new HtmlOptionResult(initOptionText, initOptionValue, selectedValue != null && selectedValue.Contains(initOptionValue)), otherHtmlAttributes);
260         }
261 
262         /// <summary>
263         /// 生成 HTML 的 Select 标签(带 multiple)
264         /// </summary>
265         /// <typeparam name="T"></typeparam>
266         /// <param name="dataSource">数据源</param>
267         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
268         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
269         /// <param name="selectedValue">选中的值</param>
270         /// <param name="id">Select 标签的 Id,可为空</param>
271         /// <param name="name">Select 标签的 name,可为空</param>
272         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
273         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
274         /// <returns></returns>
275         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
276         {
277             return GenerateHtmlSelectMultiple(dataSource, t => GetHtmlOptionResultByFuncParams(t, funText, funValue, selectedValue), id, name, initOption, otherHtmlAttributes);
278         }
279 
280         #endregion
281 
282         #region 通过 HtmlOptionResult 得到模型的 Text、Value
283 
284         /// <summary> 
285         /// 生成 HTML 的 Select 标签(带 multiple)
286         /// </summary> 
287         /// <param name="dataSource">数据源</param> 
288         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
289         /// <returns></returns>
290         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner)
291         {
292             return GenerateHtmlSelectMultiple<T>(dataSource, funcInner, null, null, null, null);
293         }
294 
295         /// <summary> 
296         /// 生成 HTML 的 Select 标签(带 multiple)
297         /// </summary> 
298         /// <param name="dataSource">数据源</param>
299         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
300         /// <param name="id">Select 标签的 Id,可为 null</param>
301         /// <param name="name">Select 标签的 Name,可为 null</param>
302         /// <returns></returns>
303         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name)
304         {
305             return GenerateHtmlSelectMultiple<T>(dataSource, funcInner, id, name, null, null);
306         }
307 
308         /// <summary> 
309         /// 生成 HTML 的 Select 标签(带 multiple)
310         /// </summary> 
311         /// <param name="dataSource">数据源</param> 
312         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
313         /// <param name="id">Select 标签的 Id,可为空</param>
314         /// <param name="name">Select 标签的 Name,可为空</param>
315         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param> 
316         /// <returns></returns>
317         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name, string otherHtmlAttributes)
318         {
319             return GenerateHtmlSelectMultiple<T>(dataSource, funcInner, id, name, null, otherHtmlAttributes); 
320         }
321 
322         /// <summary> 
323         /// 生成 HTML 的 Select 标签(带 multiple)
324         /// </summary> 
325         /// <param name="dataSource">数据源</param> 
326         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
327         /// <param name="id">Select 标签的 Id,可为 null</param>
328         /// <param name="name">Select 标签的 Name,可为 null</param>
329         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
330         /// <returns></returns> 
331         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption)
332         {
333             return GenerateHtmlSelectMultiple<T>(dataSource, funcInner, id, name, initOption, null);
334         }
335 
336         /// <summary> 
337         /// 生成 HTML 的 Select 标签(带 multiple)
338         /// </summary> 
339         /// <param name="dataSource">数据源</param>
340         /// <param name="funcInner">获取内部的调用,不能为 null</param> 
341         /// <param name="id">Select 标签的 Id,可为 null</param>
342         /// <param name="name">Select 标签的 Name,可为 null</param>
343         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
344         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param> 
345         /// <returns></returns>
346         public static string GenerateHtmlSelectMultiple<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
347         {
348             return GenerateHtmlSelect<T>(dataSource, funcInner, id, name, initOption, MULTIPLE_KEYWORD + otherHtmlAttributes);
349         }
350 
351         #endregion
352 
353         #endregion
354 
355         #region 生成 HTML 的 Select 标签(带 optgroup)
356 
357         #region 通过 Func 得到模型的 Text、Value
358 
359         /// <summary>
360         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
361         /// </summary>
362         /// <typeparam name="T"></typeparam>
363         /// <param name="dataSource">数据源</param>
364         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
365         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
366         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
367         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
368         /// <param name="selectedValue">选中的值</param>
369         /// <returns></returns>
370         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, string selectedValue)
371         {
372             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, null, null, (HtmlOptionResult)null, null);
373         }
374 
375         /// <summary>
376         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
377         /// </summary>
378         /// <typeparam name="T"></typeparam>
379         /// <param name="dataSource">数据源</param>
380         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
381         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
382         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
383         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
384         /// <param name="selectedValue">选中的值</param>
385         /// <param name="id">Select 标签的 Id,可为 null</param>
386         /// <param name="name">Select 标签的 Name,可为 null</param>
387         /// <returns></returns>
388         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name)
389         {
390             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, (HtmlOptionResult)null, null);
391         }
392 
393         /// <summary>
394         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
395         /// </summary>
396         /// <typeparam name="T"></typeparam>
397         /// <param name="dataSource">数据源</param>
398         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
399         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
400         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
401         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
402         /// <param name="selectedValue">选中的值</param>
403         /// <param name="id">Select 标签的 Id,可为 null</param>
404         /// <param name="name">Select 标签的 Name,可为 null</param>
405         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
406         /// <returns></returns>
407         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, string otherHtmlAttributes)
408         {
409             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, null, null, otherHtmlAttributes);
410         }
411 
412         /// <summary>
413         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
414         /// </summary>
415         /// <typeparam name="T"></typeparam>
416         /// <param name="dataSource">数据源</param>
417         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
418         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
419         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
420         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
421         /// <param name="selectedValue">选中的值</param>
422         /// <param name="id">Select 标签的 Id,可为 null</param>
423         /// <param name="name">Select 标签的 Name,可为 null</param>
424         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
425         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
426         /// <returns></returns>
427         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, string initOptionText, string initOptionValue)
428         {
429             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, initOptionText, initOptionValue, null);
430         }
431 
432         /// <summary>
433         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
434         /// </summary>
435         /// <typeparam name="T"></typeparam>
436         /// <param name="dataSource">数据源</param>
437         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
438         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
439         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
440         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
441         /// <param name="selectedValue">选中的值</param>
442         /// <param name="id">Select 标签的 Id,可为 null</param>
443         /// <param name="name">Select 标签的 Name,可为 null</param>
444         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
445         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
446         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
447         /// <returns></returns>
448         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, string initOptionText, string initOptionValue, string otherHtmlAttributes)
449         {
450             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, new HtmlOptionResult(initOptionText, initOptionValue, IsEqualsOrContains(initOptionValue, selectedValue)), otherHtmlAttributes);
451         }
452 
453         /// <summary>
454         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
455         /// </summary>
456         /// <typeparam name="T"></typeparam>
457         /// <param name="dataSource">数据源</param>
458         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
459         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
460         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
461         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
462         /// <param name="selectedValue">选中的值</param>
463         /// <param name="id">Select 标签的 Id,可为 null</param>
464         /// <param name="name">Select 标签的 Name,可为 null</param>
465         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
466         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
467         /// <returns></returns>
468         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, string selectedValue, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
469         {
470             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, t => GetHtmlOptionResultByFuncParams(t, funText, funValue, selectedValue), id, name, initOption, otherHtmlAttributes);
471         }
472 
473         #endregion
474 
475         #region 通过 HtmlOptionResult 得到模型的 Text、Value
476 
477         /// <summary>
478         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
479         /// </summary>
480         /// <typeparam name="T"></typeparam>
481         /// <param name="dataSource">数据源</param>
482         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
483         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
484         /// <param name="funcInner">获取内部的调用,不能为 null</param>
485         /// <returns></returns>
486         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner)
487         {
488             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, null, null, null, null);
489         }
490 
491         /// <summary>
492         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
493         /// </summary>
494         /// <typeparam name="T"></typeparam>
495         /// <param name="dataSource">数据源</param>
496         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
497         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
498         /// <param name="funcInner">获取内部的调用,不能为 null</param>
499         /// <param name="id">Select 标签的 Id,可为 null</param>
500         /// <param name="name">Select 标签的 Name,可为 null</param>
501         /// <returns></returns>
502         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name)
503         {
504             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, null, null);
505         }
506 
507         /// <summary>
508         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
509         /// </summary>
510         /// <typeparam name="T"></typeparam>
511         /// <param name="dataSource">数据源</param>
512         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
513         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
514         /// <param name="funcInner">获取内部的调用,不能为 null</param>
515         /// <param name="id">Select 标签的 Id,可为 null</param>
516         /// <param name="name">Select 标签的 Name,可为 null</param>
517         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
518         /// <returns></returns>
519         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name, string otherHtmlAttributes)
520         {
521             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, null, otherHtmlAttributes);
522         }
523 
524         /// <summary>
525         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
526         /// </summary>
527         /// <typeparam name="T"></typeparam>
528         /// <param name="dataSource">数据源</param>
529         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
530         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
531         /// <param name="funcInner">获取内部的调用,不能为 null</param>
532         /// <param name="id">Select 标签的 Id,可为 null</param>
533         /// <param name="name">Select 标签的 Name,可为 null</param>
534         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
535         /// <returns></returns>
536         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption)
537         {
538             return GenerateHtmlSelectGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, initOption, null);
539         }
540 
541         /// <summary>
542         /// 生成 HTML 的 Select 标签(带 optgroup)(PS:最大且只支持 2 级目录)
543         /// </summary>
544         /// <typeparam name="T"></typeparam>
545         /// <param name="dataSource">数据源</param>
546         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
547         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
548         /// <param name="funcInner">获取内部的调用,不能为 null</param>
549         /// <param name="id">Select 标签的 Id,可为 null</param>
550         /// <param name="name">Select 标签的 Name,可为 null</param>
551         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
552         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
553         /// <returns></returns>
554         public static string GenerateHtmlSelectGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
555         {
556             if (dataSource == null)
557             {
558                 throw new ArgumentNullException("dataSource");
559             }
560             StringBuilder textAppend = new StringBuilder();
561             GenerateHtmlSelectBeginTag(id, name, otherHtmlAttributes, textAppend);
562             GenerateHtmlSelectCoreOption(initOption, textAppend);
563             // 下面是遍历符合条件的父节点
564             foreach (var parentItem in dataSource.Where(funGetParentPredicate))
565             {
566                 GenerateHtmlSelectGroupBeginTag(funcInner(parentItem), textAppend);
567                 foreach (var currentChildItem in dataSource.Where(d => funRelationsWithParent(d, parentItem)))
568                 {
569                     GenerateHtmlSelectCoreOption(funcInner(currentChildItem), textAppend);
570                 }
571                 GenerateHtmlSelectGroupEndTag(textAppend);
572             }
573             // 下面是遍历既不是父节点,也没有父节点,也没有子节点
574             foreach (var nonParentItem in dataSource.Where(p => !funGetParentPredicate(p)))
575             {
576                 var parentItem = dataSource.FirstOrDefault(d => funRelationsWithParent(nonParentItem, d));
577                 if (parentItem == null)
578                 {
579                     GenerateHtmlSelectCoreOption(funcInner(nonParentItem), textAppend);
580                 }
581             }
582             GenerateHtmlSelectEndTag(textAppend);
583             return textAppend.ToString();
584         }
585 
586         #endregion
587 
588         #endregion
589 
590         #region 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)
591 
592         #region 通过 Func 得到模型的 Text、Value
593 
594         /// <summary>
595         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
596         /// </summary>
597         /// <typeparam name="T"></typeparam>
598         /// <param name="dataSource">数据源</param>
599         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
600         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
601         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
602         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
603         /// <param name="selectedValue">选中的值</param>
604         /// <returns></returns>
605         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue)
606         {
607             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, null, null, (HtmlOptionResult)null, null);
608         }
609 
610         /// <summary>
611         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
612         /// </summary>
613         /// <typeparam name="T"></typeparam>
614         /// <param name="dataSource">数据源</param>
615         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
616         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
617         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
618         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
619         /// <param name="selectedValue">选中的值</param>
620         /// <param name="id">Select 标签的 Id,可为 null</param>
621         /// <param name="name">Select 标签的 Name,可为 null</param>
622         /// <returns></returns>
623         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name)
624         {
625             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, (HtmlOptionResult)null, null);
626         }
627 
628         /// <summary>
629         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
630         /// </summary>
631         /// <typeparam name="T"></typeparam>
632         /// <param name="dataSource">数据源</param>
633         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
634         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
635         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
636         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
637         /// <param name="selectedValue">选中的值</param>
638         /// <param name="id">Select 标签的 Id,可为 null</param>
639         /// <param name="name">Select 标签的 Name,可为 null</param>
640         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
641         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
642         /// <returns></returns>
643         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name, string initOptionText, string initOptionValue)
644         {
645             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, initOptionText, initOptionValue, null); 
646         }
647 
648         /// <summary>
649         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
650         /// </summary>
651         /// <typeparam name="T"></typeparam>
652         /// <param name="dataSource">数据源</param>
653         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
654         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
655         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
656         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
657         /// <param name="selectedValue">选中的值</param>
658         /// <param name="id">Select 标签的 Id,可为 null</param>
659         /// <param name="name">Select 标签的 Name,可为 null</param>
660         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
661         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
662         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
663         /// <returns></returns>
664         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name, string initOptionText, string initOptionValue, string otherHtmlAttributes)
665         {
666             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funText, funValue, selectedValue, id, name, new HtmlOptionResult(initOptionText, initOptionValue, selectedValue != null && selectedValue.Contains(initOptionValue)), otherHtmlAttributes);
667         }
668 
669         /// <summary>
670         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
671         /// </summary>
672         /// <typeparam name="T"></typeparam>
673         /// <param name="dataSource">数据源</param>
674         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
675         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
676         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
677         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
678         /// <param name="selectedValue">选中的值</param>
679         /// <param name="id">Select 标签的 Id,可为 null</param>
680         /// <param name="name">Select 标签的 Name,可为 null</param>
681         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
682         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
683         /// <returns></returns>
684         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
685         {
686             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, t => GetHtmlOptionResultByFuncParams(t, funText, funValue, selectedValue), id, name, initOption, otherHtmlAttributes);
687         }
688 
689         #endregion
690 
691         #region 通过 HtmlOptionResult 得到模型的 Text、Value
692 
693         /// <summary>
694         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
695         /// </summary>
696         /// <typeparam name="T"></typeparam>
697         /// <param name="dataSource">数据源</param>
698         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
699         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
700         /// <param name="funcInner">获取内部的调用,不能为 null</param>
701         /// <returns></returns>
702         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner)
703         {
704             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, null, null, null, null);
705         }
706 
707         /// <summary>
708         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
709         /// </summary>
710         /// <typeparam name="T"></typeparam>
711         /// <param name="dataSource">数据源</param>
712         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
713         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
714         /// <param name="funcInner">获取内部的调用,不能为 null</param>
715         /// <param name="id">Select 标签的 Id,可为 null</param>
716         /// <param name="name">Select 标签的 Name,可为 null</param>
717         /// <returns></returns>
718         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name)
719         {
720             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, null, null);
721         }
722 
723         /// <summary>
724         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
725         /// </summary>
726         /// <typeparam name="T"></typeparam>
727         /// <param name="dataSource">数据源</param>
728         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
729         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
730         /// <param name="funcInner">获取内部的调用,不能为 null</param>
731         /// <param name="id">Select 标签的 Id,可为 null</param>
732         /// <param name="name">Select 标签的 Name,可为 null</param>
733         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
734         /// <returns></returns>
735         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name, string otherHtmlAttributes)
736         {
737             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, null, null);
738         }
739 
740         /// <summary>
741         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
742         /// </summary>
743         /// <typeparam name="T"></typeparam>
744         /// <param name="dataSource">数据源</param>
745         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
746         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
747         /// <param name="funcInner">获取内部的调用,不能为 null</param>
748         /// <param name="id">Select 标签的 Id,可为 null</param>
749         /// <param name="name">Select 标签的 Name,可为 null</param>
750         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
751         /// <returns></returns>
752         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption)
753         {
754             return GenerateHtmlSelectMultipleGroup(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, initOption, null);
755         }
756 
757         /// <summary>
758         /// 生成 HTML 的 Select 标签(带 multiple)(带 optgroup)(PS:最大且只支持 2 级目录)
759         /// </summary>
760         /// <typeparam name="T"></typeparam>
761         /// <param name="dataSource">数据源</param>
762         /// <param name="funGetParentPredicate">满足父类(即:一级菜单)的条件,比如:d => d.ParentId == 0 </param>
763         /// <param name="funRelationsWithParent">子类和父类的关联条件,比如:(c, p) => c.ParentId == p.Id,参数 c、p 分别表示子类和父类。</param>
764         /// <param name="funcInner">获取内部的调用,不能为 null</param>
765         /// <param name="id">Select 标签的 Id,可为 null</param>
766         /// <param name="name">Select 标签的 Name,可为 null</param>
767         /// <param name="initOption">初始化 Option,为 null 表示没有初始项</param>
768         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
769         /// <returns></returns>
770         public static string GenerateHtmlSelectMultipleGroup<T>(this IEnumerable<T> dataSource, Func<T, bool> funGetParentPredicate, Func<T, T, bool> funRelationsWithParent, Func<T, HtmlOptionResult> funcInner, string id, string name, HtmlOptionResult initOption, string otherHtmlAttributes)
771         {
772             return GenerateHtmlSelectGroup<T>(dataSource, funGetParentPredicate, funRelationsWithParent, funcInner, id, name, initOption, MULTIPLE_KEYWORD + otherHtmlAttributes);
773         }
774 
775         #endregion
776 
777         #endregion
778 
779         #region 私有方法
780 
781         /// <summary>
782         /// 换行符号
783         /// </summary>
784         private static readonly string NEWLINE = Environment.NewLine + "        ";
785 
786         /// <summary>
787         /// 比较时是否忽略大小写
788         /// </summary>
789         private static readonly bool COMPARE_IGNORECASE = true; 
790 
791         /// <summary>
792         /// 控制可以让 Select 标签的选择多个的关键字 
793         /// </summary>
794         private const string MULTIPLE_KEYWORD = " multiple=\"multiple\" ";
795 
796         /// <summary>
797         /// 通过“文本委托”、“值委托”、“选中的值”来得到 HtmlOptionResult
798         /// </summary>
799         /// <typeparam name="T"></typeparam>
800         /// <param name="source">模型的单个实例</param>
801         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
802         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
803         /// <param name="selectedValue">选中的值</param>
804         /// <returns></returns>
805         private static HtmlOptionResult GetHtmlOptionResultByFuncParams<T>(T source, Func<T, string> funText, Func<T, string> funValue, string selectedValue)
806         {
807             HtmlOptionResult temp = new HtmlOptionResult(funText(source), funValue(source));
808             temp.OptionSelected = IsEqualsOrContains(temp.OptionValue, selectedValue);
809             return temp;
810         }
811 
812         /// <summary>
813         /// 通过“文本委托”、“值委托”、“选中的值”来得到 HtmlOptionResult
814         /// </summary>
815         /// <typeparam name="T"></typeparam>
816         /// <param name="source">模型的单个实例</param>
817         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
818         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
819         /// <param name="selectedValue">选中的值</param>
820         /// <returns></returns>
821         private static HtmlOptionResult GetHtmlOptionResultByFuncParams<T>(T source, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue)
822         {
823             HtmlOptionResult temp = new HtmlOptionResult(funText(source), funValue(source));
824             if (selectedValue != null)
825             {
826                 temp.OptionSelected = IsEqualsOrContains(selectedValue, temp.OptionValue);
827             }
828             return temp;
829         }
830 
831         /// <summary>
832         /// 判断当前选中的值是否相等 或者 是否包含在里面
833         /// </summary>
834         /// <param name="source">选中的值</param>
835         /// <param name="targetValue">目标值</param>
836         /// <returns></returns>
837         private static bool IsEqualsOrContains(string source, string targetValue)
838         {
839             if (source == null || targetValue == null)
840             {
841                 return false;
842             }
843             return string.Compare(source, targetValue, COMPARE_IGNORECASE) == 0;
844         }
845 
846         /// <summary>
847         /// 判断当前选中的值是否相等 或者 是否包含在里面
848         /// </summary>
849         /// <param name="items">选中的值</param>
850         /// <param name="targetValue">目标值</param>
851         /// <returns></returns>
852         private static bool IsEqualsOrContains(IEnumerable<string> items, string targetValue)
853         {
854             if (items == null || targetValue == null)
855             {
856                 return false;
857             }
858             return items.Contains(targetValue, COMPARE_IGNORECASE ? StringComparer.InvariantCultureIgnoreCase : StringComparer.InvariantCulture);
859         }
860 
861         /// <summary>
862         /// 生成 Select 标签的开始标签
863         /// </summary>
864         /// <param name="id">Select 标签的 Id,可为空</param>
865         /// <param name="name">Select 标签的 Name,可为空</param>
866         /// <param name="otherHtmlAttributes">其他的 select 标签中的 html 属性</param>
867         /// <param name="textAppend">字符串附加器</param>
868         private static void GenerateHtmlSelectBeginTag(string id, string name, string otherHtmlAttributes, StringBuilder textAppend)
869         {
870             if (textAppend == null)
871             {
872                 throw new ArgumentNullException("textAppend");
873             }
874             textAppend.AppendFormat("<select{0}{1} {2}>" + NEWLINE,
875                 string.IsNullOrEmpty(id) ? string.Empty : string.Format(" id=\"{0}\"", HttpUtility.HtmlEncode(id)),
876                 string.IsNullOrEmpty(name) ? string.Empty : string.Format(" name=\"{0}\"", HttpUtility.HtmlEncode(name)),
877                 otherHtmlAttributes);
878         }
879 
880         /// <summary>
881         /// 生成 Select 标签的结束标签
882         /// </summary>
883         /// <param name="textAppend">字符串附加器</param>
884         private static void GenerateHtmlSelectEndTag(StringBuilder textAppend)
885         {
886             if (textAppend == null)
887             {
888                 throw new ArgumentNullException("textAppend");
889             }
890             textAppend.Append("</select>");
891         }
892 
893         /// <summary>
894         /// 生成核心的 Select 标签的子 Option 标签
895         /// </summary>
896         /// <param name="optionResult">当前 option</param>
897         /// <param name="textAppend">字符串附加器</param>
898         private static void GenerateHtmlSelectCoreOption(HtmlOptionResult optionResult, StringBuilder textAppend)
899         {
900             if (textAppend == null)
901             {
902                 throw new ArgumentNullException("textAppend");
903             }
904             if (optionResult == null)
905             {
906                 return;
907             }
908             textAppend.AppendFormat("<option value=\"{0}\"{2}>{1}</option>" + NEWLINE, HttpUtility.HtmlEncode(optionResult.OptionValue), HttpUtility.HtmlEncode(optionResult.OptionText), optionResult.OptionSelected ? " selected=\"selected\"" : string.Empty);
909         }
910 
911         /// <summary>
912         /// 生成 Select 标签下的 optgroup 的开始标签
913         /// </summary>
914         /// <param name="groupLabel">标签值</param>
915         /// <param name="textAppend">字符串附加器</param>
916         private static void GenerateHtmlSelectGroupBeginTag(HtmlOptionResult optionResult, StringBuilder textAppend)
917         {
918             if (textAppend == null)
919             {
920                 throw new ArgumentNullException("textAppend");
921             }
922             if (optionResult == null)
923             {
924                 textAppend.Append("<optgroup>");
925             }
926             else
927             {
928                 textAppend.AppendFormat("<optgroup label=\"{0}\">" + NEWLINE, HttpUtility.HtmlEncode(optionResult.OptionText));
929             }
930         }
931 
932         /// <summary>
933         /// 生成 Select 标签下的 optgroup 的结束标签
934         /// </summary>
935         /// <param name="groupLabel">标签值</param>
936         /// <param name="textAppend">字符串附加器</param>
937         private static void GenerateHtmlSelectGroupEndTag(StringBuilder textAppend)
938         {
939             if (textAppend == null)
940             {
941                 throw new ArgumentNullException("textAppend");
942             }
943             textAppend.Append("</optgroup>" + NEWLINE);
944         }
945 
946         #endregion
947     }
948 }

 

也许你还会喜欢:(原创)利用扩展方法,给 IEnumerable<T> 增加一个生成 Html 的 CheckBox 标签的方法,不用 C# 中的反射技术

谢谢浏览!