扩展htmlhelper.DropDownListFor 支持list数据源和option增加属性

简介: mvc自带的DropDownListFor数据源必须是IEnumerable。并且option不支持增加自定义属性。在使用bootstrap-select组件的时候,发现不是很好用。所以扩展了一下。 当然,因为场景的问题,我不需要group,不需要selected,所以这部分没有完成,且相应的重载方法也没有写。

mvc自带的DropDownListFor数据源必须是IEnumerable<SelectListItem>。并且option不支持增加自定义属性。在使用bootstrap-select组件的时候,发现不是很好用。所以扩展了一下。

当然,因为场景的问题,我不需要group,不需要selected,所以这部分没有完成,且相应的重载方法也没有写。只有一个core方法,算是一个半成品吧。

 1 public static MvcHtmlString DropDownListForEx<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
 2             Expression<Func<TModel, object>> expression, Func<TModel, IEnumerable<TProperty>> options,
 3             Func<TProperty, string> optionText, Func<TProperty, string> optionValue, string optionLabel = null,
 4             Func<TProperty, IDictionary<string, object>> optionHtmlAttributes = null, IDictionary<string, object> htmlAttributes = null)
 5         {
 6 
 7             var tagNameAttr = ExpressionHelper.GetExpressionText(expression);
 8             TagBuilder tag = new TagBuilder("select");
 9             if (htmlAttributes != null)
10                 tag.MergeAttributes(htmlAttributes);
11             tag.MergeAttribute("name", tagNameAttr, true);
12             tag.GenerateId(tagNameAttr);
13 
14             StringBuilder optionsHtml = new StringBuilder();
15             var os = options(htmlHelper.ViewData.Model);
16             if (optionLabel != null)
17             {
18                 TagBuilder tag3 = new TagBuilder("option");
19                 tag3.SetInnerText(optionLabel);
20                 optionsHtml.AppendLine(tag3.ToString(TagRenderMode.Normal));
21             }
22 
23             foreach (var item in os)
24             {
25                 TagBuilder tag2 = new TagBuilder("option");
26                 tag2.SetInnerText(optionText(item));
27                 if (optionHtmlAttributes != null)
28                     tag2.MergeAttributes(optionHtmlAttributes(item));
29                 tag2.MergeAttribute("value", optionValue(item), true);
30                 var oHtml = tag2.ToString(TagRenderMode.Normal);
31                 optionsHtml.AppendLine(oHtml);
32             }
33 
34             tag.InnerHtml = optionsHtml.ToString();
35             return new MvcHtmlString(tag.ToString(TagRenderMode.Normal));
36         }
View Code

调用方式:

depInfos:List<>
 @Html.DropDownListForEx(p => p.DepCode, p => depInfos, p => p.Name, p => p.Id, "请选择", p => new Dictionary<string, object>() { { "data-tokens", p.NamePinYin+" "+p.NameFirstPinYin } }, new Dictionary<string, object> { { "class", "selectpicker" }, { "data-live-search", true } })

 

顺便介绍一下bootstrap-select组件。bootstrap框架下面的下拉选择组件,支持下拉搜索选择,关键字可自定义。上面的我的例子就是一个地址选择例子,使用地址的全拼,首字母拼音搜索

具体例子参考官方地址。有详细说明和demo

官方地址:http://silviomoreto.github.io/bootstrap-select

git地址:https://github.com/silviomoreto/bootstrap-select

官方例子截图:

目录
相关文章
|
5月前
|
前端开发 开发者
CSS列表属性:list-style系列属性详解
CSS列表属性:list-style系列属性详解
275 40
|
6月前
|
SQL Java
【SpringBoot】List<实体类>如何去重,单、多属性去重
【SpringBoot】List<实体类>如何去重,单、多属性去重
433 0
|
11月前
|
Java 数据库连接
hibernate-validator校验对象属性为List
hibernate-validator校验对象属性为List
197 1
|
6月前
|
XML Java 数据格式
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
70 0
|
6月前
|
Java
JDK8 Stream之如何给List属性去重?
JDK8 Stream之如何给List属性去重?
549 0
|
Java
java8 List根据对象中属性去重-多属性去重-去除重复字符串
java8 List根据对象中属性去重-多属性去重-去除重复字符串
1065 0
|
数据库
List中对象去重和List 根据对象的属性去重
有这么一个需求,需要将从数据库查出来的数据进行去重。
113 0
|
Java
【JAVA】反射获取对象/LIST中对象属性
【JAVA】反射获取对象/LIST中对象属性
415 0
Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组
Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组
688 4
|
安全 Java
Java中找出List集合中属性名为key属性值为value的对象
在日常开发中,我们需要从一个 List 集合中找出其中某一个对象,下面就介绍如何从 List 集合中找出属性名为 key 属性值为 value 的对象
319 0
Java中找出List集合中属性名为key属性值为value的对象