C# 是否可以对多个选项进行建模?

C# Is it possible to model bind multiple options?

我有一个下拉菜单,您可以在其中 select 多个选项。

此下拉菜单的代码是:

如何在 C# 中绑定多个 'devices' 以便在加载此下拉列表时 模型绑定会自动 select 所有传递到视图中的选项?

模型中的设备 属性 应该是一个 ID 列表(其中是一个简单类型,如 int 或字符串),而不是一个设备模型列表(因为您在中使用 new SelectList(Model.Devices, "ID", "Description") Helper 我看到 Model.Devices 是复杂对象的集合)

因此您的模型应该如下所示:

public List<Device> AvailableDevices { get;set; }

public List<string> Devices { get;set; }

助手应该是

@Html.ListBoxFor(m=>m.Devices,new SelectList(Model.AvailableDevices , "ID", "Description"))

@Html.DropDownListFor(m=>m.Devices,new SelectList(Model.AvailableDevices , "ID", "Description", new {multiple="multiple"})

post 操作应接收 List<string> 作为参数或完整模型:

[HttpPost]
public ActionResult Submit(List<string> devices)

[HttpPost]
public ActionResult Submit(YourModel model) 
//where YourModel model is the same type that you are using to render your view

在这种情况下,我会在视图模型中执行以下操作

public string Devices { get; set; }
List<int> innerList;
public List<int> List
{
    get
    {
        if (this.innerList == null)
        {
            if (string.IsNullOrEmpty(this.Devices))
            {
                this.innerList = this.Devices.Split(',').Select(x => int.Parse(x)).ToList();
            }
            else
            {
                this.innerList = new List<int>();
            }
        }

        return this.innerList;
    }
}

其中 Devices 是与下拉列表绑定的 属性,它 return 由 , 分隔的所有项目。 当您尝试访问 List 时,它会将项目和 return 分开,作为 List<int>

我将其解析为 int 因为通常我将 int 视为 ID

但我期待更好的选择。

PS

我在与 Select2

合作时这样做

对于您的情况,您应该使用另一个助手 - @Html.ListBoxFor 它应该生成具有 multiple 属性的 select 元素。

//note that i use MaintanceDevices property
@Html.ListBoxFor(x => x.MaintanceDevices, new SelectList(Model.Devises, "ID", "Description"), new { @class = "multiselect form-control"})

此外,不要在助手中设置 id 属性。最好在您的 ViewModel 中创建另一个 属性:

public List<int> MaintanceDevices { get; set; }

在 Controller 中填充它,MVC 会自动为您的 select 元素生成正确的标记,绑定到表单 POST。