MVC 5 下拉列表用于编辑视图中的多选值绑定

Raj*_*Raj 3 c# asp.net-mvc jquery-select2 dropdownlistfor

我在编辑视图中有一个 select2 多选下拉列表。当我尝试将选定的值绑定到下拉列表时,它无法绑定。任何帮助表示赞赏。请从 *.cshtml 和 *.cs 文件中找到以下代码片段。

@Html.DropDownListFor(model => model.Items, new MultiSelectList(ViewBag.ItemsBag, "Value", "Text", Model.ItemsSelected.Select(x => x.Value)), new { @class = "form-control features-segments select2-multiselect-checkbox", multiple = "multiple" })

ViewBag.ItemsBag = db.Items.Select(v => new SelectListItem
            {
                Text = v.ItemName,
                Value = v.ItemId.ToString()
            });

ModelVM modelVM = new ModelVM()
            {
                ItemsSelected = SelectedItems.Items.Select(x => new SelectListItem() { Text = x.ItemName, Value = x.ItemId.ToString() })
            };
Run Code Online (Sandbox Code Playgroud)

物品模型有以下物品。属性 ItemsSelected 不为 null,其中有 3 个值,ViewBag.ItemsBag 也不为 null,并且包含数据库中的所有项目。这两个属性都是具有 Text 和 Value 属性的 SelectListItem 类型。

public int FeatureId { get; set; }
public string FeatureName { get; set; }
public string ReferenceName { get; set; }
public FeatureSection SectionName { get; set; }//Enum
public FeatureType Type { get; set; }//Enum
public bool DefaultBoolValue { get; set; }
public string DefaultTextValue { get; set; }
public IEnumerable<SelectListItem> ItemsSelected { get; set; }
public virtual ICollection<Item> Items { get; set; } = new List<Item>();
Run Code Online (Sandbox Code Playgroud)

Tet*_*oto 6

由于您在这样的ViewBag定义中提供了项目值,这清楚地表明了字符串值:

ViewBag.ItemsBag = db.Items.Select(v => new SelectListItem
{
    Text = v.ItemName,
    Value = v.ItemId.ToString() // implies all values are strings
});
Run Code Online (Sandbox Code Playgroud)

然后要绑定的属性DropDownListFor/ListBox必须具有List<string>string[]类型才能正确绑定。UsingICollection<Item>不会绑定,因为它是一个复杂的对象,而 helper 需要绑定值类型(数字类型/字符串)。

因此,您必须首先创建一个带有类型的属性List<string>

public List<string> SelectedValues { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后使用ListBoxFor具有该属性的 helper 代替:

@Html.ListBoxFor(model => model.SelectedValues, new MultiSelectList(ViewBag.ItemsBag, "Value", "Text", Model.ItemsSelected.Select(x => x.Value)), new { @class = "form-control features-segments select2-multiselect-checkbox", multiple = "multiple" })
Run Code Online (Sandbox Code Playgroud)

笔记:

如果ItemId属性具有int类型(并且所有值都可以转换为int),请尝试使用List<int>/ int[]type 而不是List<string>/ string[]

public List<int> SelectedValues { get; set; }
Run Code Online (Sandbox Code Playgroud)