代码改变世界

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

2011-06-21 18:19  音乐让我说  阅读(555)  评论(0编辑  收藏  举报

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


代码胜过一切说明:

EnumerableExtender.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConAppTestDemo
{
    public static class EnumerableExtender
    {
        #region 生成 HTML 的 CheckBox 标签

        /// <summary>
        /// 生成 HTML 的 CheckBox 标签
        /// </summary>
        /// <typeparam name="T">数据源的类型</typeparam>
        /// <param name="dataSource">数据源</param>
        /// <param name="name">CheckBox 标签的 Name</param>
        /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值</param>
        /// <param name="funcInner">获取内部的调用</param>
        /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
        /// <returns></returns>
        public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, string name, string idPrefix, Func<T, HtmlCheckBoxResult> funcInner, IEnumerable<string> selectedValues)
        {
            return GenerateHtmlCheckBox(dataSource, name, idPrefix, funcInner, selectedValues, null);
        }

        /// <summary>
        /// 生成 HTML 的 CheckBox 标签
        /// </summary>
        /// <typeparam name="T">数据源的类型</typeparam>
        /// <param name="dataSource">数据源</param>
        /// <param name="name">CheckBox 标签的 Name</param>
        /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值</param>
        /// <param name="funcInner">获取内部的调用</param>
        /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
        /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
        /// <returns></returns>
        public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, string name, string idPrefix, Func<T, HtmlCheckBoxResult> funcInner, IEnumerable<string> selectedValues, string otherHtmlAttributes)
        {
            if (dataSource == null)
            {
                throw new ArgumentNullException("dataSource");
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            StringBuilder textAppend = new StringBuilder();
            HtmlCheckBoxResult checkboxResult;
            foreach (var item in dataSource)
            {
                checkboxResult = funcInner(item);
                bool ifSelected = false;
                if (checkboxResult.OptionSelected == null)
                {
                    if (selectedValues != null)
                    {
                        if (selectedValues.Contains(checkboxResult.OptionValue, StringComparer.CurrentCultureIgnoreCase))
                        {
                            ifSelected = true;
                        }
                    }
                }
                else
                {
                    ifSelected = checkboxResult.OptionSelected.Value;
                }
                textAppend.AppendFormat("<input type=\"checkbox\" name=\"{0}\" id=\"{1}\" value=\"{2}\" {4} {5}/><label for=\"{1}\">{3}</label>", name, idPrefix + "_" + checkboxResult.OptionValue, checkboxResult.OptionValue, checkboxResult.OptionText, ifSelected ? "checked=\"checked\"" : string.Empty, otherHtmlAttributes ?? string.Empty);
            }
            return textAppend.ToString();
        }

        #endregion
    }
}

HtmlTextValueResult.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConAppTestDemo
{
    public class HtmlTextValueResult
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="optionText">显示的文本</param>
        /// <param name="optionValue">文本对应的值</param>
        public HtmlTextValueResult(string optionText, string optionValue)
        {
            this.OptionText = optionText;
            this.OptionValue = optionValue;
        }

        /// <summary>
        /// 显示的文本
        /// </summary>
        public string OptionText
        {
            get;
            set;
        }

        /// <summary>
        /// 文本对应的值
        /// </summary>
        public string OptionValue
        {
            get;
            set;
        }
    }
}

HtmlCheckBoxResult.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConAppTestDemo
{
    public class HtmlCheckBoxResult : HtmlTextValueResult
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="optionText">显示的文本</param>
        /// <param name="optionValue">文本对应的值</param>
        public HtmlCheckBoxResult(string optionText, string optionValue)
            : this(optionText, optionValue, null)
        {

        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="optionText">显示的文本</param>
        /// <param name="optionValue">文本对应的值</param>
        /// <param name="optionSelected">Checkbox 标签是否应该选中</param>
        public HtmlCheckBoxResult(string optionText, string optionValue, bool? optionSelected)
            : base(optionText,optionValue)
        {
            this.OptionSelected = optionSelected;
        }

        /// <summary>
        /// Checkbox 标签是否应该选中
        /// </summary>
        public bool? OptionSelected
        {
            get;
            set;
        }
    }
}

Program.cs

using System;
using System.Collections.Generic;

namespace ConAppTestDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> ltStudent = new List<Student>()
            {
                new Student(){ ID=1, Name = "张三" },
                new Student(){ ID=2, Name = "李四" },
                new Student(){ ID=3, Name = "王五" },
                new Student(){ ID=4, Name = "赵六" },
                new Student(){ ID=5, Name = "杨七" }
            };

            Console.WriteLine("以下演示根据选中的值动态选中:");
            string html1 = ltStudent.GenerateHtmlCheckBox("chkGroup", "chkGroup", (Student s) =>
            {
                return new HtmlCheckBoxResult(s.Name, s.ID.ToString());
            }, new string[] { "2", "3" }, null);
            Console.WriteLine(html1);
            Console.WriteLine();

            Console.WriteLine("以下演示让所有的 CheckBox 都选中:");
            string html2 = ltStudent.GenerateHtmlCheckBox("chkGroup", "chkGroup", (Student s) =>
            {
                return new HtmlCheckBoxResult(s.Name, s.ID.ToString(), true); //注意这里只是多加了一个 true
            }, new string[] { "2", "3" }, null);
            Console.WriteLine(html2);
            Console.WriteLine();

            Console.WriteLine("以下演示让所有的 CheckBox 都不选中:");
            string html3 = ltStudent.GenerateHtmlCheckBox("chkGroup", "chkGroup", (Student s) =>
            {
                return new HtmlCheckBoxResult(s.Name, s.ID.ToString(), false); //注意这里只是多加了一个 false
            }, new string[] { "2", "3" }, null);
            Console.WriteLine(html3);
            Console.WriteLine();

            Console.ReadKey();
        }
    }

    class Student
    {
        public int ID
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }
    }
}

 

最新更新如下:

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 HtmlCheckBoxExtensions
 10     {
 11         #region 生成 HTML 的 CheckBox 标签
 12 
 13         #region 通过 Func 得到模型的 Text、Value
 14 
 15         /// <summary>
 16         /// 生成 HTML 的 CheckBox 标签 
 17         /// </summary>
 18         /// <typeparam name="T">数据源类型</typeparam>
 19         /// <param name="dataSource">数据源</param>
 20         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
 21         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
 22         /// <param name="name">CheckBox 标签的 Name</param>
 23         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
 24         /// <returns></returns>
 25         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, IEnumerable<string> selectedValues)
 26         {
 27             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, null, selectedValues, (HtmlOptionResult)null, null);
 28         }
 29 
 30         /// <summary>
 31         /// 生成 HTML 的 CheckBox 标签 
 32         /// </summary>
 33         /// <typeparam name="T">数据源类型</typeparam>
 34         /// <param name="dataSource">数据源</param>
 35         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
 36         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
 37         /// <param name="name">CheckBox 标签的 Name</param>
 38         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
 39         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
 40         /// <returns></returns>
 41         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, string idPrefix, IEnumerable<string> selectedValues)
 42         {
 43             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, idPrefix, selectedValues, (HtmlOptionResult)null, null);
 44         }
 45 
 46         /// <summary>
 47         /// 生成 HTML 的 CheckBox 标签 
 48         /// </summary>
 49         /// <typeparam name="T">数据源类型</typeparam>
 50         /// <param name="dataSource">数据源</param>
 51         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
 52         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
 53         /// <param name="name">CheckBox 标签的 Name</param>
 54         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
 55         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
 56         /// <returns></returns>
 57         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, IEnumerable<string> selectedValues, string otherHtmlAttributes)
 58         {
 59             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, null, selectedValues, (HtmlOptionResult)null, otherHtmlAttributes);
 60         }
 61 
 62         /// <summary>
 63         /// 生成 HTML 的 CheckBox 标签 
 64         /// </summary>
 65         /// <typeparam name="T">数据源类型</typeparam>
 66         /// <param name="dataSource">数据源</param>
 67         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
 68         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
 69         /// <param name="name">CheckBox 标签的 Name</param>
 70         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
 71         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
 72         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
 73         /// <returns></returns>
 74         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, string idPrefix, IEnumerable<string> selectedValues, string otherHtmlAttributes)
 75         {
 76             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, idPrefix, selectedValues, (HtmlOptionResult)null, otherHtmlAttributes); 
 77         }
 78 
 79         /// <summary>
 80         /// 生成 HTML 的 CheckBox 标签 
 81         /// </summary>
 82         /// <typeparam name="T">数据源类型</typeparam>
 83         /// <param name="dataSource">数据源</param>
 84         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
 85         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
 86         /// <param name="name">CheckBox 标签的 Name</param>
 87         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
 88         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
 89         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
 90         /// <returns></returns>
 91         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, IEnumerable<string> selectedValues, string initOptionText, string initOptionValue)
 92         {
 93             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, null, selectedValues, initOptionText, initOptionValue, null);
 94         }
 95 
 96         /// <summary>
 97         /// 生成 HTML 的 CheckBox 标签 
 98         /// </summary>
 99         /// <typeparam name="T">数据源类型</typeparam>
100         /// <param name="dataSource">数据源</param>
101         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
102         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
103         /// <param name="name">CheckBox 标签的 Name</param>
104         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
105         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
106         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
107         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
108         /// <returns></returns>
109         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, string idPrefix, IEnumerable<string> selectedValues, string initOptionText, string initOptionValue)
110         {
111             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, idPrefix, selectedValues, initOptionText, initOptionValue, null);
112         }
113 
114         /// <summary>
115         /// 生成 HTML 的 CheckBox 标签 
116         /// </summary>
117         /// <typeparam name="T">数据源类型</typeparam>
118         /// <param name="dataSource">数据源</param>
119         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
120         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
121         /// <param name="name">CheckBox 标签的 Name</param>
122         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
123         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
124         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
125         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
126         /// <returns></returns>
127         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, IEnumerable<string> selectedValues, string initOptionText, string initOptionValue, string otherHtmlAttributes)
128         {
129             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, null, selectedValues, new HtmlOptionResult(initOptionText, initOptionValue, IsEqualsOrContains(selectedValues, initOptionValue)), otherHtmlAttributes);
130         }
131 
132         /// <summary>
133         /// 生成 HTML 的 CheckBox 标签 
134         /// </summary>
135         /// <typeparam name="T">数据源类型</typeparam>
136         /// <param name="dataSource">数据源</param>
137         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
138         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
139         /// <param name="name">CheckBox 标签的 Name</param>
140         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
141         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
142         /// <param name="initOptionText">初始化 Option 的 Text 值</param>
143         /// <param name="initOptionValue">初始化 Option 的 Value 值</param>
144         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
145         /// <returns></returns>
146         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, string idPrefix, IEnumerable<string> selectedValues, string initOptionText, string initOptionValue, string otherHtmlAttributes)
147         {
148             return GenerateHtmlCheckBox(dataSource, funText, funValue, name, idPrefix, selectedValues, new HtmlOptionResult(initOptionText, initOptionValue, IsEqualsOrContains(selectedValues, initOptionValue)), otherHtmlAttributes);
149         }
150 
151         /// <summary>
152         /// 生成 HTML 的 CheckBox 标签 
153         /// </summary>
154         /// <typeparam name="T">数据源类型</typeparam>
155         /// <param name="dataSource">数据源</param>
156         /// <param name="funText">从模型中得到 checkbox 的 Text 值</param>
157         /// <param name="funValue">从模型中得到 checkbox 的 Value 值</param>
158         /// <param name="name">CheckBox 标签的 Name</param>
159         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
160         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
161         /// <param name="initOption">初始项</param>
162         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
163         /// <returns></returns>
164         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, string> funText, Func<T, string> funValue, string name, string idPrefix, IEnumerable<string> selectedValues, HtmlOptionResult initOption, string otherHtmlAttributes)
165         {
166             return GenerateHtmlCheckBox(dataSource, t => GetHtmlOptionResultByFuncParams(t, funText, funValue, selectedValues), name, idPrefix, selectedValues, initOption, otherHtmlAttributes);
167         }
168 
169         #endregion
170 
171         #region 通过 HtmlOptionResult 得到模型的 Text、Value
172 
173         /// <summary>
174         /// 生成 HTML 的 CheckBox 标签 
175         /// </summary>
176         /// <typeparam name="T">数据源的类型</typeparam>
177         /// <param name="dataSource">数据源</param>
178         /// <param name="funcInner">获取内部的调用</param>
179         /// <param name="name">CheckBox 标签的 Name</param>
180         /// <returns></returns>
181         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name)
182         {
183             return GenerateHtmlCheckBox(dataSource, funcInner, name, null, null, null, null);
184         }
185 
186         /// <summary>
187         /// 生成 HTML 的 CheckBox 标签 
188         /// </summary>
189         /// <typeparam name="T">数据源的类型</typeparam>
190         /// <param name="dataSource">数据源</param>
191         /// <param name="funcInner">获取内部的调用</param>
192         /// <param name="name">CheckBox 标签的 Name</param>
193         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
194         /// <returns></returns>
195         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, string idPrefix)
196         {
197             return GenerateHtmlCheckBox(dataSource, funcInner, name, idPrefix, null, null, null);
198         }
199 
200         /// <summary>
201         /// 生成 HTML 的 CheckBox 标签 
202         /// </summary>
203         /// <typeparam name="T">数据源的类型</typeparam>
204         /// <param name="dataSource">数据源</param>
205         /// <param name="funcInner">获取内部的调用</param>
206         /// <param name="name">CheckBox 标签的 Name</param>
207         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
208         /// <returns></returns>
209         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, IEnumerable<string> selectedValues)
210         {
211             return GenerateHtmlCheckBox(dataSource, funcInner, name, null, selectedValues, null, null);
212         }
213 
214         /// <summary>
215         /// 生成 HTML 的 CheckBox 标签 
216         /// </summary>
217         /// <typeparam name="T">数据源的类型</typeparam>
218         /// <param name="dataSource">数据源</param>
219         /// <param name="funcInner">获取内部的调用</param>
220         /// <param name="name">CheckBox 标签的 Name</param>
221         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
222         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
223         /// <returns></returns>
224         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, string idPrefix, IEnumerable<string> selectedValues)
225         {
226             return GenerateHtmlCheckBox(dataSource, funcInner, name, idPrefix, selectedValues, null, null);
227         }
228 
229         /// <summary>
230         /// 生成 HTML 的 CheckBox 标签 
231         /// </summary>
232         /// <typeparam name="T">数据源的类型</typeparam>
233         /// <param name="dataSource">数据源</param>
234         /// <param name="funcInner">获取内部的调用</param>
235         /// <param name="name">CheckBox 标签的 Name</param>
236         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
237         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
238         /// <returns></returns>
239         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, IEnumerable<string> selectedValues, string otherHtmlAttributes)
240         {
241             return GenerateHtmlCheckBox(dataSource, funcInner, name, null, selectedValues, null, otherHtmlAttributes);
242         }
243 
244         /// <summary>
245         /// 生成 HTML 的 CheckBox 标签 
246         /// </summary>
247         /// <typeparam name="T">数据源的类型</typeparam>
248         /// <param name="dataSource">数据源</param>
249         /// <param name="funcInner">获取内部的调用</param>
250         /// <param name="name">CheckBox 标签的 Name</param>
251         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
252         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
253         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
254         /// <returns></returns>
255         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, string idPrefix, IEnumerable<string> selectedValues, string otherHtmlAttributes)
256         {
257             return GenerateHtmlCheckBox(dataSource, funcInner, name, idPrefix, selectedValues, null, otherHtmlAttributes);
258         }
259 
260         /// <summary>
261         /// 生成 HTML 的 CheckBox 标签 
262         /// </summary>
263         /// <typeparam name="T">数据源的类型</typeparam>
264         /// <param name="dataSource">数据源</param>
265         /// <param name="funcInner">获取内部的调用</param>
266         /// <param name="name">CheckBox 标签的 Name</param>
267         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
268         /// <param name="initOption">初始项</param>
269         /// <returns></returns>
270         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, IEnumerable<string> selectedValues, HtmlOptionResult initOption)
271         {
272             return GenerateHtmlCheckBox(dataSource, funcInner, name, null, selectedValues, initOption, null);
273         }
274 
275         /// <summary>
276         /// 生成 HTML 的 CheckBox 标签 
277         /// </summary>
278         /// <typeparam name="T">数据源的类型</typeparam>
279         /// <param name="dataSource">数据源</param>
280         /// <param name="funcInner">获取内部的调用</param>
281         /// <param name="name">CheckBox 标签的 Name</param>
282         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
283         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
284         /// <param name="initOption">初始项</param>
285         /// <returns></returns>
286         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, string idPrefix, IEnumerable<string> selectedValues, HtmlOptionResult initOption)
287         {
288             return GenerateHtmlCheckBox(dataSource, funcInner, name, idPrefix, selectedValues, initOption, null);
289         }
290 
291         /// <summary>
292         /// 生成 HTML 的 CheckBox 标签 
293         /// </summary>
294         /// <typeparam name="T">数据源的类型</typeparam>
295         /// <param name="dataSource">数据源</param>
296         /// <param name="funcInner">获取内部的调用</param>
297         /// <param name="name">CheckBox 标签的 Name</param>
298         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
299         /// <param name="initOption">初始项</param>
300         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
301         /// <returns></returns>
302         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, IEnumerable<string> selectedValues, HtmlOptionResult initOption, string otherHtmlAttributes)
303         {
304             return GenerateHtmlCheckBox(dataSource, funcInner, name, null, selectedValues, initOption, null);
305         }
306 
307         /// <summary>
308         /// 生成 HTML 的 CheckBox 标签 
309         /// </summary>
310         /// <typeparam name="T">数据源的类型</typeparam>
311         /// <param name="dataSource">数据源</param>
312         /// <param name="funcInner">获取内部的调用</param>
313         /// <param name="name">CheckBox 标签的 Name</param>
314         /// <param name="idPrefix">CheckBox 标签的 Id 前缀,默认的格式是:Id前缀 + 下划线 + 值。</param>
315         /// <param name="selectedValues">被选中的值,没有则传入 Null</param>
316         /// <param name="initOption">初始项</param>
317         /// <param name="otherHtmlAttributes">CheckBox 标签中其他的 html 属性</param>
318         /// <returns></returns>
319         public static string GenerateHtmlCheckBox<T>(this IEnumerable<T> dataSource, Func<T, HtmlOptionResult> funcInner, string name, string idPrefix, IEnumerable<string> selectedValues, HtmlOptionResult initOption, string otherHtmlAttributes)
320         {
321             if (dataSource == null)
322             {
323                 throw new ArgumentNullException("dataSource");
324             }
325             if (name == null)
326             {
327                 throw new ArgumentNullException("name");
328             }
329             StringBuilder textAppend = new StringBuilder();
330             GenerateHtmlCheckBoxCoreTag(textAppend, initOption, name, idPrefix, otherHtmlAttributes);
331             HtmlOptionResult checkboxResult;
332             foreach (var item in dataSource)
333             {
334                 checkboxResult = funcInner(item);
335                 bool ifSelected = false;
336                 if (selectedValues != null)
337                 {
338                     if (selectedValues.Contains(checkboxResult.OptionValue, COMPARE_IGNORECASE ? StringComparer.InvariantCultureIgnoreCase : StringComparer.InvariantCulture))
339                     {
340                         ifSelected = true;
341                     }
342                 }
343                 checkboxResult.OptionSelected |= ifSelected;
344                 GenerateHtmlCheckBoxCoreTag(textAppend, checkboxResult, name, idPrefix, otherHtmlAttributes);
345             }
346             return textAppend.ToString();
347         }
348 
349         #endregion
350 
351         #endregion
352 
353         #region 私有方法
354 
355         /// <summary>
356         /// 换行符号
357         /// </summary>
358         private static readonly string NEWLINE = Environment.NewLine + "        ";
359 
360         /// <summary>
361         /// 比较时是否忽略大小写
362         /// </summary>
363         private static readonly bool COMPARE_IGNORECASE = true;
364 
365         /// <summary>
366         /// 判断当前选中的值是否相等 或者 是否包含在里面
367         /// </summary>
368         /// <param name="items">选中的值</param>
369         /// <param name="targetValue">目标值</param>
370         /// <returns></returns>
371         private static bool IsEqualsOrContains(IEnumerable<string> items, string targetValue)
372         {
373             if (items == null || targetValue == null)
374             {
375                 return false;
376             }
377             return items.Contains(targetValue, COMPARE_IGNORECASE ? StringComparer.InvariantCultureIgnoreCase : StringComparer.InvariantCulture);
378         }
379 
380         /// <summary>
381         /// 通过“文本委托”、“值委托”、“选中的值”来得到 HtmlOptionResult
382         /// </summary>
383         /// <typeparam name="T"></typeparam>
384         /// <param name="source">模型的单个实例</param>
385         /// <param name="funText">从模型中得到 Select Option 的 Text 值</param>
386         /// <param name="funValue">从模型中得到 Select Option 的 Value 值</param>
387         /// <param name="selectedValue">选中的值</param>
388         /// <returns></returns>
389         private static HtmlOptionResult GetHtmlOptionResultByFuncParams<T>(T source, Func<T, string> funText, Func<T, string> funValue, IEnumerable<string> selectedValue)
390         {
391             HtmlOptionResult temp = new HtmlOptionResult(funText(source), funValue(source));
392             if (selectedValue != null)
393             {
394                 temp.OptionSelected = IsEqualsOrContains(selectedValue, temp.OptionValue);
395             }
396             return temp;
397         }
398 
399         /// <summary>
400         /// 生成 CheckBox 标签的核心标签
401         /// </summary>
402         /// <param name="textAppend">字符串附加器</param>
403         private static void GenerateHtmlCheckBoxCoreTag(StringBuilder textAppend, HtmlOptionResult optionResult, string name, string idPrefix, string otherHtmlAttributes)
404         {
405             if (textAppend == null)
406             {
407                 throw new ArgumentNullException("textAppend");
408             }
409             if (optionResult == null)
410             {
411                 return;
412             }
413             textAppend.AppendFormat(
414                 "<input type=\"checkbox\" name=\"{0}\" id=\"{1}\" value=\"{2}\" {4} {5}/><label for=\"{1}\">{3}</label>" + NEWLINE, 
415                 HttpUtility.HtmlEncode(name),
416                 string.IsNullOrEmpty(idPrefix) ? HttpUtility.HtmlEncode(name + "_" + optionResult.OptionValue) : HttpUtility.HtmlEncode(idPrefix + "_" + optionResult.OptionValue),
417                 HttpUtility.HtmlEncode(optionResult.OptionValue),
418                 HttpUtility.HtmlEncode(optionResult.OptionText),
419                 optionResult.OptionSelected ? "checked=\"checked\"" : string.Empty, 
420                 otherHtmlAttributes);
421         }
422 
423         #endregion
424     }
425 }

 

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

谢谢浏览!