繁体   English   中英

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个其他属性(请注意,这是假设BuildingServiceUser模型的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()为何DropDownListFor在提交后丢失多选但为何ListBoxFor不会丢失多重选择中所述。

您的查看代码现在将为

@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" })
....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM