select2组件是一款代搜索功能的html下拉框辅助组件,官方 demo以及文档:http://select2.github.io/examples.html

=》

最简单的使用方法(前期绑定数据):

1.在html页面上新建select控件。该select控件可以由asp.net DropDownList控件生成,也可以自己写html,也可以mvc 生成  @Html.DropDownListFor(t => t.OutHandlerId, ViewBag.Users as List<SelectListItem>)

 <select name="ddlSelect2Demo" id="ddlSelect2Demo" style="width:100px;">
<option value="1">江苏</option>
<option value="2">安徽</option>
<option value="3">上海</option>
<option value="4">北京</option>
<option value="5">浙江</option>
</select>

2.页面引入selec2组件(vs环境下建议使用nuget),包含:select2.min.css、select2.min.js。依赖jquery 1.7以上版本需提前准备

3.在页面加载完毕后使用js 调用select2初始化配置select组件

 <script type="text/javascript">
$(document).ready(function () {
InitSelect2();
}); function InitSelect2() {
$("#ddlSelect2Demo").select2();
}
</script>

完整demo(asp.net webForm方式)

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Select2Demo.aspx.cs" Inherits="WebApp_Select2Demo.Select2Demo" %>

 <!DOCTYPE html>

 <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Select2Demo</title> <%--1.nuget引入select2前端组件包--%>
<link href="Content/css/select2.min.css" rel="stylesheet" />
<script src="Scripts/jquery-1.8.2.min.js"></script>
<script src="Scripts/select2.min.js"></script> <script type="text/javascript">
$(document).ready(function () {
InitSelect2();
}); function InitSelect2() {
$("#ddlSelect2Demo").select2();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
筛选下拉框:
<asp:DropDownList ID="ddlSelect2Demo" runat="server" Width="100px"></asp:DropDownList>
</div>
</form>
</body>
</html>
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApp_Select2Demo
{
public partial class Select2Demo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ddlSelect2Demo.Items.AddRange(new ListItem[]
{
new ListItem("江苏","1"),
new ListItem("安徽","2"),
new ListItem("上海","3"),
new ListItem("北京","4"),
new ListItem("浙江","5"),
new ListItem("广东","6"),
new ListItem("西藏","7"),
new ListItem("云南","8"),
new ListItem("山东","6"),
new ListItem("青海","7"),
new ListItem("新疆","8"),
});
}
}
}

.net mvc方式也差不多:

在后端Controller写select数据源:ViewBag.Users = new List<SelectListItem>{  /*下拉框数据*/};

前端绑定数据源:@Html.DropDownListFor(t => t.OutHandlerId, ViewBag.Users as List<SelectListItem>)

1.在下拉数据量小于1000以下,直接List绑定到select控件,非常简单

2.下拉数据量巨大,>5000情况下,要么用ajax远程json动态读取方法,要么仍用方法1但是总List缓存(根据需求每1h或者每天)

其他注意点:

1.务必加载$("#id").select2()

2.tags:false(默认)不需添加。若为了true将把新增的name作为id传入后端(所以id类型为string)

下面一段为复杂配置,支持远程ajax、并且对结果进行处理

//初始化页面上的所有select2组件
function InitSelect2() {
$(".goodsNames").select2({
ajax: {
//url: "https://api.github.com/search/repositories",
url: "../Goods/GetGoodsInfoByLikeName",
dataType: 'json',
delay: 500,
data: function (params) {
return {
q: params.term,
};
},
processResults: function (data) {
return { results: data };
},
cache: true
},
escapeMarkup: function (markup) { return markup; },
minimumInputLength: 1,
templateResult: formatRepo,
templateSelection: formatRepoSelection,
tags: (!IsOutWarehouse()) //true:允许用户输入新事物名,入库或入库同时出库;false:仅允许选中已有的事物、不需输入新的,出库
});
} //卸载页面上的所有select2组件
function DestroySelect2() {
$(".goodsNames").select2('destroy');
} //select2搜索结果下拉框操作回调
function formatRepo(repo) {
if (repo != null && repo != undefined) {
//可获取到接口的其他属性:Quantity等
if (repo.id == repo.text) {
if (IsPositiveFloat(repo.id)) {
return ""; //禁止事物名为纯数字,防止后端混淆
} else {
return repo.text + "(新)";
}
} else {
return repo.text;
}
}
} //select2选中结果操作回调
function formatRepoSelection(repo) {
var selectElemName = repo.element.parentNode.name;
if (IsOutWarehouse()) { //出库不许新增,所以不会出现此情况
if (repo.Quantity <= 0) {
alert("该事务库存为0,无法出库。请及时采购");
//TODO:BUG 体验很不好
//$("select[name='" + selectElemName + "']").val("");
$("select[name='" + selectElemName + "']").select2().val(null).trigger("change");
return "";
}
} else {
if (IsPositiveFloat(repo.id)) {
return ""; //禁止事物名为纯数字,防止后端混淆
} else {
return repo.text + "(新)";
}
} //事务存在,则赋值
if (repo.Quantity != undefined) {
var id = GetIdByElemName(selectElemName);
$("select[name='WarehouseInOutDetails[" + id + "].GoodsIdOrNameStr']").attr("data-goodsid", repo.id);
$("input[name='WarehouseInOutDetails[" + id + "].Quantity']").attr("data-stock-num", repo.Quantity);
$("select[name='WarehouseInOutDetails[" + id + "].UnitId']").val(repo.UnitId);
$("select[name='WarehouseInOutDetails[" + id + "].TypeId']").val(repo.TypeId);
}
return repo.text;
}

建议:

1.不要动态加减select控件并绑定select2,会很复杂又bug。即使调用销毁方法也难搞

2.不建议tags,难控制。因为会将name作为id传给后端,比如若用户输入222,后端难以判断222是已存在的id:222呢还是新增的name:222

3.在直接绑定的情况下,allowClear:true  属性会产生X但是点击无效、无法清除。具体原因未知,只能通过绑定时在option里新增一个val=0的无效值、用户选中后、后端再判断该值无效、忽略查询。ajax情况下没问题。

4.若使用ajax来做,当表单处于编辑时就要显示之前新建的下拉框。这时默认不行、必须在此select下增加单个option,<option value="@Model.SupplierId">@Model.SupplierName </option>

selec2组件使用方法的更多相关文章

  1. React-Native 组件开发方法

    前言 React Native的开发思路是通过组合各种组件来组织整个App,在大部分情况下通过组合View.Image等几个基础的组件,可以非常方便的实现各种复杂的跨平台组件,不过在需要原生功能支持. ...

  2. WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常

    WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...

  3. 查看 activex 组件的方法

    查看 activex 组件的方法 可以使用的工具COMRaider 直接安装 并选择对应的类型即可查看相关的信息,比OLE/COM Object Viewer 简洁方便. 具体的操作如下: 随意选择一 ...

  4. 解决 window server2008 r2 没有注册Ofiice组件的方法

    解决 window server2008  r2 没有注册Ofiice组件的方法   .NET下在用Microsoft.Office.Interop.Excel及word 操作Excel和Word时, ...

  5. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  6. Unity3D 获得GameObject组件的方法

    Unity3D 获得GameObject组件的方法有几种,这里进行说明一下: 组件: 要获得这些组件,进行操作的话,绑定一个Movescipt 的C#组件,里面的获取方法为 void Update ( ...

  7. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  8. 在javascript中使用com组件的方法

    转载自:  http://dhailin.blog.163.com/blog/static/230738322011128102043880/ 首先创建一个COM组件,插入一个双接口Itest,在此接 ...

  9. 在JS中使用COM组件的方法

    首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 ...

随机推荐

  1. EasyUI - DataGrid 去右边空白滚动条列

    在网上查了很长时间没有找到解决方法,干脆自已查看一下代码来解决吧,随是压缩过的,不过也还是好查的,工夫不负有心人,终于解决了,方法如下: 一.我们先让表格自适应宽度 <!DOCTYPE html ...

  2. 腾讯云SpringBoot部署 + HTTPS配置

    springboot可以打包为jar和war,jar不多说了,最近的一个工程需要打包为war发布,大致说一下吧: 先看一下项目的大致结构: 第一步,需要排除springboot自带的tomcat插件 ...

  3. 用VS2012建立core2.1网站项目后引用Microsoft.AspNetCore.Session不了

    做个.NET CORE的新项目,和往常一样,VS2017新建CORE项目(CORE2.1),NUGET引入session,结果引入不了,说什么版本不对应的,把SESSION降了一个版本,可以安装上了, ...

  4. Roller5.0.3安装配置部署 step by step

    一.下载roller 下载地址:http://roller.apache.org/downloads/downloads.html下载下来之后,解压包含两部份doc.webapps 二.准备环境 1. ...

  5. docker启动centos7后sudo不能使用

    docker启动centos7后sudo不能使用 过程 使用docker -it xxx /bin/sh进入centos镜像,然后安装了docker,想使用systemctl start docker ...

  6. 2. Attention Is All You Need(Transformer)算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

  7. svn常见错误解决

    Svn冲突导致锁住的解决方案:错误码:svn: E155037: Previous operation has not finished; run 'cleanup' if it was interr ...

  8. Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM

    I find using the following works quite well for SQL min/max dates after many DB related errors: Date ...

  9. Kettle能做什么?

    简介 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目的主程序员MATT  ...

  10. M0 M4关于库函数的讲解(以时钟为例)

    #define CLK_PWRCON_PD_WAIT_CPU_Pos 8 #define CLK_PWRCON_PD_WAIT_CPU_Msk (1ul << CLK_PWRCON_PD_ ...