C# i收集<;选择列表项>;在MVC视图模型中

C# i收集<;选择列表项>;在MVC视图模型中,c#,asp.net-mvc,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Asp.net Mvc Viewmodel,我有一个viewmodel,用于将字段组合到字段集的页面 虚拟机如下所示: public class FieldsetVM { public Int64 ID { get; set; } public string Name { get; set; } [Display(Name = "Available Fields")] public ICollection<SelectListItem> AvailableFields { get; set;

我有一个viewmodel,用于将字段组合到字段集的页面

虚拟机如下所示:

public class FieldsetVM
{
    public Int64 ID { get; set; }
    public string Name { get; set; }

    [Display(Name = "Available Fields")]
    public ICollection<SelectListItem> AvailableFields { get; set; }

    [Display(Name = "Current Fields")]
    public ICollection<SelectListItem> UsedFields { get; set; }

    public FieldsetVM(int id, string name, List<Field> availFields, List<Field> usedFields)
    {
        this.ID = id;
        this.Name = name;

        this.AvailableFields = new List<SelectListItem>();

        foreach (Field field in availFields)
            this.AvailableFields.Add(new SelectListItem { Text = string.Format("{0} ({1})", field.Name, field.FieldType.ToString()), Value = field.FieldID.ToString() });

        this.UsedFields = new List<SelectListItem>();

        foreach (Field field in usedFields)
            this.UsedFields.Add(new SelectListItem { Text = string.Format("{0} ({1})", field.Name, field.FieldType.ToString()), Value = field.FieldID.ToString() });
    }

    public FieldsetVM()
    {
    }
}
    [HttpGet]
    public ActionResult Create()
    {
        FieldsetVM vm = new FieldsetVM(0, "", uw.FieldRepo.Get().ToList(), new List<Field>());

        return View(vm);
    }
    <div class="col-md-3 col-xs-6">
    <div class="editor-label">
        @Html.LabelFor(m => m.AvailableFields)
    </div>
    <div class="editor-field">
        @Html.ListBoxFor(m => m.AvailableFields, Model.AvailableFields)
    </div>

    <button type="button" onclick="moveSelected('AvailableFields','UsedFields');">Move Selected</button>
</div>

<div class="col-md-3 col-xs-6">
    <div class="editor-label">
        @Html.LabelFor(m => m.UsedFields)
    </div>
    <div class="editor-field">
        @Html.ListBoxFor(m => m.UsedFields, Model.UsedFields)
    </div>

    <button type="button" onclick="moveSelected('UsedFields','AvailableFields');">Remove Selected</button>
</div>
}

然后我在控制器中有一个帖子:

    [HttpPost]
    public ActionResult Create(FieldsetVM postedVm)
    {
        Fieldset fs = new Fieldset();

        fs.Name = postedVm.Name;

        if (fs.Fields == null)
            fs.Fields = new List<Field>();

        fs.Fields.Clear();

        foreach (SelectListItem item in postedVm.UsedFields)
            fs.Fields.Add(uw.FieldRepo.GetByID(item.Value));

        uw.FieldsetRepo.Insert(fs);

        return RedirectToAction("Index");
    }
[HttpPost]
公共操作结果创建(FieldsetVM postedVm)
{
字段集fs=新字段集();
fs.Name=postedVm.Name;
如果(fs.Fields==null)
fs.Fields=新列表();
fs.Fields.Clear();
foreach(在postedVm.UsedFields中选择ListItem项)
fs.Fields.Add(uw.FieldRepo.GetByID(item.Value));
uw.FieldsetRepo.Insert(fs);
返回操作(“索引”);
}
我的期望是,在postedVm中,我们能够看到用户在UsedFields中选择的值。相反,当用户发回HttpPost Create()操作时,UsedFields和AvailableFields始终为空

我试图找出原因:在列表框之间移动项目肯定是一种相当常见的配置方式吗?MVC不应该查看生成的对象中的值并使用它们填充postedVm对象吗

编辑根据最佳答案的反馈,以下是我修改的创建/发布操作

        [HttpPost]
    public ActionResult Create(FieldsetVM postedVm, int[] UsedFields)
    {
        Fieldset fs = new Fieldset();

        fs.Name = postedVm.Name;

        fs.Fields = new List<Field>();

        foreach (int id in UsedFields)
            fs.Fields.Add(uw.FieldRepo.GetByID(id));

        uw.FieldsetRepo.Insert(fs);
        uw.Save();

        return RedirectToAction("Index");
    }
[HttpPost]
公共操作结果创建(FieldsetVM postedVm,int[]UsedFields)
{
字段集fs=新字段集();
fs.Name=postedVm.Name;
fs.Fields=新列表();
foreach(UsedFields中的int-id)
fs.Fields.Add(uw.FieldRepo.GetByID(id));
uw.FieldsetRepo.Insert(fs);
uw.Save();
返回操作(“索引”);
}

发布表单时,只会发布可用字段和已使用字段的ID。如果您有多个值,那么您将得到一个逗号分隔的ID列表,因此modelbinding将无法将这些已发布的ID绑定到
FieldsetVM postedVm

如果您执行类似于
公共操作结果创建(int[]availableFields,int[]usedFields)
的操作,您应该能够获取所选ID

        [HttpPost]
    public ActionResult Create(FieldsetVM postedVm, int[] UsedFields)
    {
        Fieldset fs = new Fieldset();

        fs.Name = postedVm.Name;

        fs.Fields = new List<Field>();

        foreach (int id in UsedFields)
            fs.Fields.Add(uw.FieldRepo.GetByID(id));

        uw.FieldsetRepo.Insert(fs);
        uw.Save();

        return RedirectToAction("Index");
    }