我有一个视图,显示来自ViewModel的集合,用户可以在其中更新每个集合项目的属性(熟练度的“级别”)。MVC中的集合查看和更新控制器中的模型?
这里的景观:
@model Consultants.ViewModels.ProgramsViewModel
@{
ViewBag.Title = "Programkunskaper";
}
<h2>@ViewBag.Title</h2>
<div id="formDiv">
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Ny arbetserfarenhet</legend>
<table>
<tr>
<th>
Program
</th>
<th>
Nivå
</th>
</tr>
@Html.EditorFor(m => m.ProgramSkills, "ProgramSkills")
@*Using editorformodel instead of for loop according to tip here: http://stackoverflow.com/questions/5420471/use-dropdownlistfor-with-foreach-in-asp-net-mvc-view*@
</table>
<p>
<input type="submit" value="Spara" />
</p>
</fieldset>
}
</div>
而且EditorFor模板:
@model Consultants.Models.ProgramSkill
<tr>
<td>@Model.Program.Name
</td>
<td>
@Html.DropDownListFor(
model => model.Level,
new SelectList(new[] { 0, 1, 2, 3, 4, 5 },
Model.Level
)
)
</td>
</tr>
这里是我的操作方法(我知道,使用索引视图似乎有点怪异,我可能会改变但现在没关系):
public ActionResult Index()
{
Consultant consultant = _repository.GetConsultantByUserName(User.Identity.Name);
ViewBag.Consultant = consultant;
if (consultant.ProgramSkills.Count == 0)
{
List<Program> programs = _repository.GetAllPrograms();
foreach (var program in programs)
{
consultant.ProgramSkills.Add(new ProgramSkill { Program = program });
}
_repository.Save();
}
ProgramsViewModel vm = new ProgramsViewModel();
vm.ProgramSkills = consultant.ProgramSkills.ToList();
return View(vm);
}
[HttpPost]
public ActionResult Index(ProgramsViewModel vm, FormCollection collection)
{
Consultant consultant = _repository.GetConsultantByUserName(User.Identity.Name);
List<ProgramSkill> programSkills = consultant.ProgramSkills.ToList();
for (int i = 0; i < programSkills.Count; i++)
{
var programSkill = programSkills[i];
programSkill.Level = vm.ProgramSkills[i].Level;
}
_repository.Save();
vm.ProgramSkills = programSkills;
return View(vm);
}
现在,即使这工作正常,我意识到我需要成为能够通过Program.Category属性将ProgramSkill项目分组。但后来我会遇到几个问题:
如何将它们分组并将它们传递到ViewModel中?
这些对象是Program,ProgramSkill和Consultant,程序和顾问之间存在多对多关系,而ProgramSkill是联结表(由于它具有附加属性“级别”),因此它是必需的。
如果我有一个Linq表达式来根据它对它们进行分组,并且可以使它成为视图可以使用的ViewModel,那么在回发给Controller之后如何再次更新模型呢?
看起来代码会变得更加复杂,如果完全可以完成的话,只是为了按Program.Category对ProgramSkill项目进行分类。但同时,如果物品未分类,视图将具有非常差的可用性...
任何人都知道一个很好的解决方案吗?