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

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         }

调用方式:

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

官方例子截图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

WCF中关于可靠会话的BUG!!

对WCF的可靠会话编程有一定了解的人应该知道,我们可以使用 DeliveryRequirementsAttribute 可以指示WCF确认绑定提供服务或客户端实...

19310
来自专栏大内老A

[WCF REST] WebServiceHost有何特别之处?

WCF为REST服务的寄宿提供了一个新的ServiceHost,即WebServiceHost。WebServiceHost是ServiceHost的子类,而W...

2126
来自专栏hbbliyong

依赖注入(IOC)

背景介绍 在设计模式中,尤其是结构型模式很多时候解决的就是对象间的依赖关系,变依赖具体为依赖抽象。平时开发中如果发现客户程序依赖某个或某类对象,我们常常会对他...

2824
来自专栏大内老A

WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

在本篇文章中,我们将讨论WCF四大契约(服务契约、数据契约、消息契约和错误契约)之一的消息契约(Message Contract)。服务契约关注于对服务操作的描...

3655
来自专栏名山丶深处

springboot集成jpa

2375
来自专栏开发 & 算法杂谈

Hiredis源码阅读(一)

Hiredis库主要包含三类API:同步api、异步api以及回复解析api。首先介绍一下同步api以及回复解析api。

46311
来自专栏崔庆才的专栏

Javascript调试命令——你只会Console.log() ?

Console 对象提供对浏览器控制台的接入(如:Firefox 的 Web Console)。不同浏览器上它的工作方式是不一样的,但这里会介绍一些大都会提供的...

3234
来自专栏Unity

检测Unity客户端无效的预设资源

4、不被代码间接引用,如预设Anniver_01,在代码中是"Anniver_"+number,这种暂时没有好办法解决。

2394
来自专栏GreenLeaves

C# 多线程系列之异步回调(委托)

本文参考自C#基础:线程之异步回调(委托),纯属读书笔记 在解析异步回调之前,先看同步回调的执行过程,以及代码原理。 1、线程的同步执行 同步执行:在主线程执...

3215
来自专栏Python攻城狮

Django教程(三)- Django表单Form1.Form 基本使用2.Form中字段及插件3.通过Django表单Form来完成需求4.自定义验证验证规则

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

1684

扫码关注云+社区