C# i收集<;选择列表项>;在MVC视图模型中
我有一个viewmodel,用于将字段组合到字段集的页面 虚拟机如下所示: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;
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");
}