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