【问题标题】:Return selected objects for MultiSelect DropDownList返回 MultiSelect DropDownList 的选定对象
【发布时间】:2014-09-10 03:17:17
【问题描述】:

我已将此 DropDownListFor 添加到我的(部分)视图 _CreateUser.cshtml 中:

<div class="modal fade bs-example-modal-lg" id="createUserModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title">Create A User</h4>
    </div>
    @using (Html.BeginForm("Create", "Users", FormMethod.Post))
    {
        <div class="modal-body">

            @Html.LabelFor(model => model.Departments)
            <div>
                @Html.DropDownListFor(
                model => model.SelectedDepartmentIds,
                new SelectList(Model.DepartmentSelectList, "Value", "Text"),
                new {@class = "multiselect departments", multiple = "multiple"})
            </div>
        ...

以上部分视图在主视图Index.cshtml中声明,并在单击“创建”按钮时显示为模式弹出窗口

@Html.ActionLink("Create user", "Create", "Users", new { @class = "btn btn-primary", @href = "#createUserModal", @data_toggle="modal" })    
...    
@Html.Partial("_CreateUser", new UserViewModel()
             {   //Populating SelectList required for loading dropdownlist
                 DepartmentSelectList = modelFactory != null ? 
                                        modelFactory.Departments.Select(dept => new SelectListItem{Value = dept.Id.ToString(),Text = dept.Name}).ToList() 
                                        : null
             })

UserViewModel.cs

public IEnumerable<String> Departments { get; set; }
//Used purely for binding DropDownList
public IEnumerable<SelectListItem> DepartmentSelectList { get; set; } 
public string SelectedDepartmentIds { get; set; }
//Ideally, I want to populate selected items in this list
public IEnumerable<DepartmentModel> DepartmentModels { get; set; } 

UserController.cs

[HttpPost]
public ActionResult Create(UserViewModel postedModel)
{
        if (ModelState.IsValid)
        {
            //Incorrect - returns only first selected Id
            string selectedIds = postedModel.SelectedDepartmentIds;

            //Correct - returns correct selected Ids
            string selectedIds1 = ModelState["SelectedDepartmentId"].Value.AttemptedValue;
            ...
            ...

两个问题:

如何从作为模型属性“SelectedDepartmentId”的一部分的 DropDownList 中检索所有选定的项目?我是否需要在运行时使用 jQuery 来更新 ModalProperty?

我可以设置我的视图以便将 Modal 属性“DepartmentModels”与 DropDownList 绑定 - 这将帮助我检索所选项目的完整对象吗? 目前,如果我尝试这样做,我会收到此错误:
{"从类型 'System.String' 到类型 '...DepartmentModel' 的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。"}

谢谢!

【问题讨论】:

  • “如何从 DropDownList 中检索所有选定的项目”。您正在使用DropDownListFor,它只允许选择一项。您要选择多个项目吗? &lt;select&gt;control 只回发单个值,而不是复杂对象的所有属性。
  • 我使用 jQuery 来允许多选为:$('.multiselect').multiselect();
  • 在这种情况下,属性SelectedDepartmentIds 可能应该是string[](我不熟悉您使用的插件,但&lt;select multiple&gt; 通常返回一个值数组)

标签: asp.net-mvc-4


【解决方案1】:

通过各种谷歌搜索后解决:-)

下面是正确加载和返回选定对象的代码 -

型号:

public class UserGroupViewModel
{
    public IEnumerable<SelectListItem> GroupSelectList
    {
        get
        {
            List<Group> groups = new List<Group>
                {
                    new Group() {Id = 1, Name = "AA"},
                    new Group() {Id = 2, Name = "BB"},
                    new Group() {Id = 3, Name = "CC"}
                };
            IEnumerable<SelectListItem> groupsSelectList = groups.Select(group => new SelectListItem                                                                          {   Text = group.Name, Value = group.Id.ToString(), Selected = group.Id == 2}).ToList();
            return groupsSelectList;
        }
    }

    [Required]
    [Display(Name = "Group")]
    public int[] SelectedGroupIds { get; set; }
}

查看:

<div class="form-group">
    @Html.LabelFor(model => model.SelectedGroupIds, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownListFor(model => model.SelectedGroupIds,
                                Model.GroupSelectList,
                                new { @class = "multiselect", multiple = "multiple" })
        @Html.ValidationMessageFor(model => model.SelectedGroupIds)
    </div>
</div>

要在表单加载时将某些项目显示为“已选择”,只需将 SelectListItem 的“已选择”属性设置为 true。

HTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多