选择2 Asp.net MVC - 下拉列表不对初始数据进行估值



>我正在使用使用 MVC 5 和 C# 的 select2。

我在加载模型初始数据的下拉列表 (select2( 时遇到问题。

在相应绑定字段中传递的项已正确值,但它们未显示在 select2!

我的意思是,尽管控制器正确评估了 ViewModel 字段的列表,但下拉列表 (select2( 的值不正确,就好像绑定模型不起作用一样。

不用说,我正在谷歌搜索 1,5 天。

幸運(:)(我在加载包含所有项目的 select2 时没有问题,即使在帖子上,下拉列表也能正常工作,即使我可以获取所选项目。

非常感谢大家

PS:现在我在写作,我有一个疑问;可能是 select2 不适用于列表?

视图

@section scripts{
...
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
}
@Html.DropDownListFor(model => model.MezziStraSelect, Model.MezziStraOrdinari, new { style = "width: 100%", @class = "form-control" })

.JS

$(document).ready(function () {
//...
$("#MezziStraSelect").select2({
placeholder: "Select one or more items",
multiple: true,
allowClear: true
});
@if ( Model.MezziStraSelect == null)
{
<text>$("#MezziStraSelect").val(null).trigger("change");</text>
}    
}

视图模型

public Guid[] MezziStraSelect { get; set; }
public MultiSelectList MezziStraOrdinari { get; set; }

控制器

//Load List MezziStraOrdinari
var _stra = m.GetMezziStraordinari().Select(x => new
{
id = x.VoceSpesaID,
desc = x.VoceSpesa
}).ToList();
//view model set field
vm.MezziStraOrdinari = new MultiSelectList(_stra, "id", "desc");
//Load array Mezzi used from item selected

List<Guid> _mezziStraUsati = new List<Guid>();
var elems = dc.ItemSelected.FirstOrDefault(x => x.ItemID.ToString() == _guidSelected);
if (elems!=null)
{
elems.VociSpese.ToList().ForEach(x =>
{
if (x.VociSpesa.Straordinario == true)
_mezziStraUsati.Add(x.VoceSpesaViaggioID); //VoceSpesaViaggioID is GUID 
});
if (_mezziStraUsati.Count>0)
vm.MezziStraSelect = _mezziStraUsati.ToArray(); //Guid[]
}

Select2 的初始加载 不幸的是,绑定无法设置初始值!

因此,阅读 Select2 文档到此链接,我必须通过 JS 进行手动上传。

实际上,为了尝试做人类的事情(我希望是这样(,我在模型字段的后端创建了一个扩展方法

扩展方法

public static string ToSelect2Array<T>(this T[] values)
{
var resp = string.Empty;
values.ToList().ForEach(x => resp += $"'{x.ToString()}',");
if (resp.Length > 0)
resp = resp.Substring(0, resp.Length - 1);
return resp;
}

然后在JS客户端,我这样称呼它:

视图(脚本 JS(

@if ( Model.MezziStraSelect != null)
{
<text>
$("#MezziStraSelect").val([@Html.Raw(Model.MezziStraSelect.ToSelect2Array())]);
$("#MezziStraSelect").trigger('change');
</text>
}
else
{
<text>$("#MezziStraSelect").val(null).trigger("change");</text>
}

这工作得很好,但是有没有可能没有办法让它自动绑定?

我很想知道其他解决方案,比这更优雅,我会不胜感激!

最新更新