(原创)利用扩展方法,给 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# 中的反射技术
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。