【发布时间】:2013-01-29 00:06:27
【问题描述】:
我需要帮助编写 jquery/ajax 来填充 Select2 下拉框。
对于那些不知道Select2 是什么的人来说,它是一个 javascript 扩展,为 html 选择列表下拉框提供 Twitter Bootstrap 外观和搜索/提前输入功能。有关更多信息,请查看此处的示例:Select2 Github page
已更新 - 已解决!
所以我终于把这一切放在一起,我的问题的解决方案是我缺少格式化结果和列表选择的函数。下面的代码生成了一个功能正常的 Select2 保管箱,具有完美的预输入功能。
控制器上的Json方法:
public JsonResult FetchItems(string query)
{
DatabaseContext dbContext = new DatabaseContext(); //init dbContext
List<Item> itemsList = dbContext.Items.ToList(); //fetch list of items from db table
List<Item> resultsList = new List<Item>; //create empty results list
foreach(var item in itemsList)
{
//if any item contains the query string
if (item.ItemName.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0)
{
resultsList.Add(item); //then add item to the results list
}
}
resultsList.Sort(delegate(Item c1, Item c2) { return c1.ItemName.CompareTo(c2.ItemName); }); //sort the results list alphabetically by ItemName
var serialisedJson = from result in resultsList //serialise the results list into json
select new
{
name = result.ItemName, //each json object will have
id = result.ItemID //these two variables [name, id]
};
return Json(serialisedJson , JsonRequestBehavior.AllowGet); //return the serialised results list
}
上面的 Json 控制器方法返回一个序列化的 Json 对象列表,其 ItemName 包含提供的字符串“查询”(此“查询”来自Select2 下拉框中的搜索框)。
下面的代码是视图中的 Javascript(或您喜欢的布局),用于驱动 Select2 下拉框。
Javascript:
$("#hiddenHtmlInput").select2({
initSelection: function (element, callback) {
var elementText = "@ViewBag.currentItemName";
callback({ "name": elementText });
},
placeholder: "Select an Item",
allowClear: true,
style: "display: inline-block",
minimumInputLength: 2, //you can specify a min. query length to return results
ajax:{
cache: false,
dataType: "json",
type: "GET",
url: "@Url.Action("JsonControllerMethod", "ControllerName")",
data: function (searchTerm) {
return { query: searchTerm };
},
results: function (data) {
return {results: data};
}
},
formatResult: itemFormatResult,
formatSelection: function(item){
return item.name;
}
escapeMarkup: function (m) { return m; }
});
然后在视图的主体中,您需要一个隐藏的 Input 元素,Select2 会将 Dropbox 渲染到该元素。
HTML:
<input id="hiddenHtmlInput" type="hidden" class="bigdrop" style="width: 30%" value=""/>
或将 MVC Razor html.hidden 元素附加到您的视图模型,以使您能够将选择的项目 Id 发布回服务器。
HTML(MVC 剃刀):
@Html.HiddenFor(m => m.ItemModel.ItemId, new { id = "hiddenHtmlInput", @class = "bigdrop", style = "width: 30%", placeholder = "Select an Item" })
【问题讨论】:
-
我昨天刚做了这个,虽然是一个正常的下拉菜单。您使用 SelectListItem。我可以给出代码,但什么是“Select2”?
-
Select2 是一个附加插件,它以 Bootstrap 样式提供具有 v. 功能的下拉框。 ivaynberg.github.com/select2
标签: asp.net-mvc jquery jquery-select2