asp.net mvc 中的多选列表模型绑定
multiselect list model binding in asp.net mvc
我有 3 个多选下拉列表。当我从每个下拉列表中进行多项选择并提交时,我可以看到结果正在发布但没有传递给控制器。
我的观点
@model Facility.AdgarWeb.ViewModels.MailingConfigVM
@using (Html.BeginForm("New", "MailingConfig"))
{
@*Company List Dropdown*@
<div class="mailingConfiguration__modal__dropDown mailingConfiguration__modal__dropDown--companyList">
<h3 class="mailingConfiguration__modal__dropDown__title">Wybierz Budynki</h3>
<div class="dropdown companiesDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="companiesButton" aria-haspopup="true" aria-expanded="false">
Select Building
</button>
@Html.LabelFor(m => m.allBuildings)
@Html.DropDownListFor(m => m.allBuildings, new MultiSelectList(Model.allBuildings, "Id", "Name"), new { @class="dropdown-menu", @multiple="true" })
</div>
</div>
@*Classification List Dropdown*@
<div class="mailingConfiguration__modal__dropDown mailingConfiguration__modal__dropDown--classificationList">
<h3 class="mailingConfiguration__modal__dropDown__title">Wybierz Klasyfikacje</h3>
<div class="dropdown classificationDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="classificationButton" aria-haspopup="true" aria-expanded="false">
Select Classification
</button>
@Html.LabelFor(m => m.allServices)
@Html.DropDownListFor(m => m.allServices, new MultiSelectList(Model.allServices, "Id", "Name"), new { @class = "dropdown-menu", @multiple = "true" })
</div>
</div>
@*Users List Dropdown*@
<div class="mailingConfiguration__modal__dropDown mailingConfiguration__modal__dropDown--usersList">
<h3 class="mailingConfiguration__modal__dropDown__title">Wybierz Użytkowników</h3>
<div class="dropdown usersDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="usersButton" aria-haspopup="true" aria-expanded="false">
Select Users
</button>
@Html.LabelFor(m => m.allUsers)
@Html.DropDownListFor(m => m.allUsers, new MultiSelectList(Model.allUsers, "Id", "UserName"), new { @class = "dropdown-menu", @multiple = "true" })
</div>
</div>
<input type="submit" class="btn btn-primary" name="New" value="Submit">
}
视图模型
public class MailingConfigVM
{
[Display(Name = "Buildings")]
public IEnumerable<Building> allBuildings { get; set; }
[Display(Name = "Services")]
public IEnumerable<Facility.Model.Service> allServices { get; set; }
[Display(Name = "Users")]
public IEnumerable<User> allUsers { get; set; }
}
控制器
public ActionResult Create()
{
if (!SessionControlService.CheckIsLoginStillTrue(_loginsService, HttpContext))
return RedirectToAction("Login", "Account");
MailingConfigVM vm = new MailingConfigVM();
vm.allBuildings = _buildingService.GetBuildings();
vm.allServices = _serviceService.GetServices();
vm.allUsers = _userService.GetUsers().Where(user => user.Roles.Any(r => r.Id <= 4));
var buildings = _buildingService.GetBuildings().ToList();
return View(vm);
}
[Authorize(Roles = "Admin")]
[HttpPost]
public ActionResult New(MailingConfigVM mailingConfigVM)
{
if (!SessionControlService.CheckIsLoginStillTrue(_loginsService, HttpContext))
return RedirectToAction("Login", "Account");
if (!User.IsInAnyRoles("Admin"))
return RedirectToAction("Index");
return RedirectToAction("Create", "MailingConfig");
}
创建控制器用数据填充表单以供选择,新控制器是 httppost。我希望将选定的项目传递给此控制器,但在 POST 之后,每个列表的结果都是 "COUNT=0"。
如有任何帮助,我将不胜感激。
您不能将 <select multiple>
绑定到复杂对象的集合,这就是您的属性。 <select multiple>
回发一个简单值数组。
您的模型需要 3 个额外的属性(请注意,这假设您的 Building
、Service
和 User
模型的 Id
属性是 typeof int
)
public IEnumerable<int> SelectedBuildings { get; set; }
public IEnumerable<int> SelectedServices { get; set; }
public IEnumerable<int> SelectedUsers { get; set; }
此外,您应该制作集合属性 IEnumerable<SelectListItem>
,并在控制器中使用 new SelectList(...)
,而不是视图来创建选项,例如
public IEnumerable<SelectListItem> AllBuildings { get; set; }
....
并在控制器中
vm.AllBuildings = new SelectList(_buildingService.GetBuildings(), "Id", "Name");
最后,为了正确绑定,您必须使用 ListBoxFor()
,而不是
中解释的 DropDownListFor()
您的查看代码现在将是
@Html.LabelFor(m => m.SelectedBuildings)
@Html.ListBoxFor(m => m.SelectedBuildings, Model.AllBuildings, new { @class="dropdown-menu" })
....
@Html.ListBoxFor(m => m.SelectedServices, Model.AllServices, new { @class="dropdown-menu" })
....
我有 3 个多选下拉列表。当我从每个下拉列表中进行多项选择并提交时,我可以看到结果正在发布但没有传递给控制器。
我的观点
@model Facility.AdgarWeb.ViewModels.MailingConfigVM
@using (Html.BeginForm("New", "MailingConfig"))
{
@*Company List Dropdown*@
<div class="mailingConfiguration__modal__dropDown mailingConfiguration__modal__dropDown--companyList">
<h3 class="mailingConfiguration__modal__dropDown__title">Wybierz Budynki</h3>
<div class="dropdown companiesDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="companiesButton" aria-haspopup="true" aria-expanded="false">
Select Building
</button>
@Html.LabelFor(m => m.allBuildings)
@Html.DropDownListFor(m => m.allBuildings, new MultiSelectList(Model.allBuildings, "Id", "Name"), new { @class="dropdown-menu", @multiple="true" })
</div>
</div>
@*Classification List Dropdown*@
<div class="mailingConfiguration__modal__dropDown mailingConfiguration__modal__dropDown--classificationList">
<h3 class="mailingConfiguration__modal__dropDown__title">Wybierz Klasyfikacje</h3>
<div class="dropdown classificationDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="classificationButton" aria-haspopup="true" aria-expanded="false">
Select Classification
</button>
@Html.LabelFor(m => m.allServices)
@Html.DropDownListFor(m => m.allServices, new MultiSelectList(Model.allServices, "Id", "Name"), new { @class = "dropdown-menu", @multiple = "true" })
</div>
</div>
@*Users List Dropdown*@
<div class="mailingConfiguration__modal__dropDown mailingConfiguration__modal__dropDown--usersList">
<h3 class="mailingConfiguration__modal__dropDown__title">Wybierz Użytkowników</h3>
<div class="dropdown usersDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="usersButton" aria-haspopup="true" aria-expanded="false">
Select Users
</button>
@Html.LabelFor(m => m.allUsers)
@Html.DropDownListFor(m => m.allUsers, new MultiSelectList(Model.allUsers, "Id", "UserName"), new { @class = "dropdown-menu", @multiple = "true" })
</div>
</div>
<input type="submit" class="btn btn-primary" name="New" value="Submit">
}
视图模型
public class MailingConfigVM
{
[Display(Name = "Buildings")]
public IEnumerable<Building> allBuildings { get; set; }
[Display(Name = "Services")]
public IEnumerable<Facility.Model.Service> allServices { get; set; }
[Display(Name = "Users")]
public IEnumerable<User> allUsers { get; set; }
}
控制器
public ActionResult Create()
{
if (!SessionControlService.CheckIsLoginStillTrue(_loginsService, HttpContext))
return RedirectToAction("Login", "Account");
MailingConfigVM vm = new MailingConfigVM();
vm.allBuildings = _buildingService.GetBuildings();
vm.allServices = _serviceService.GetServices();
vm.allUsers = _userService.GetUsers().Where(user => user.Roles.Any(r => r.Id <= 4));
var buildings = _buildingService.GetBuildings().ToList();
return View(vm);
}
[Authorize(Roles = "Admin")]
[HttpPost]
public ActionResult New(MailingConfigVM mailingConfigVM)
{
if (!SessionControlService.CheckIsLoginStillTrue(_loginsService, HttpContext))
return RedirectToAction("Login", "Account");
if (!User.IsInAnyRoles("Admin"))
return RedirectToAction("Index");
return RedirectToAction("Create", "MailingConfig");
}
创建控制器用数据填充表单以供选择,新控制器是 httppost。我希望将选定的项目传递给此控制器,但在 POST 之后,每个列表的结果都是 "COUNT=0"。
如有任何帮助,我将不胜感激。
您不能将 <select multiple>
绑定到复杂对象的集合,这就是您的属性。 <select multiple>
回发一个简单值数组。
您的模型需要 3 个额外的属性(请注意,这假设您的 Building
、Service
和 User
模型的 Id
属性是 typeof int
)
public IEnumerable<int> SelectedBuildings { get; set; }
public IEnumerable<int> SelectedServices { get; set; }
public IEnumerable<int> SelectedUsers { get; set; }
此外,您应该制作集合属性 IEnumerable<SelectListItem>
,并在控制器中使用 new SelectList(...)
,而不是视图来创建选项,例如
public IEnumerable<SelectListItem> AllBuildings { get; set; }
....
并在控制器中
vm.AllBuildings = new SelectList(_buildingService.GetBuildings(), "Id", "Name");
最后,为了正确绑定,您必须使用 ListBoxFor()
,而不是
DropDownListFor()
您的查看代码现在将是
@Html.LabelFor(m => m.SelectedBuildings)
@Html.ListBoxFor(m => m.SelectedBuildings, Model.AllBuildings, new { @class="dropdown-menu" })
....
@Html.ListBoxFor(m => m.SelectedServices, Model.AllServices, new { @class="dropdown-menu" })
....