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。
我有一个下拉菜单,您可以在其中 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。