У меня есть представление, которое отображает коллекцию из ViewModel, где пользователь может обновить свойство для каждого элемента коллекции («Уровень» мастерства).
Вот вид:
@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: /4972285/ispolzovat-dropdownlist-dlya-foreach-v-asp-net-mvc-view*@
</table>
<p>
<input type="submit" value="Spara" />
</p>
</fieldset>
}
</div>
И редактор для шаблона:
@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>
Вот мои методы действий (я знаю, использование представления Index кажется немного странным, и я, вероятно, это изменит, но пока не обращайте на это внимания):
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);
}
Теперь, несмотря на то, что это работает нормально, я понял, что мне нужно иметь возможность группировать элементы ProgramSkill по его свойству Program.Category. Но тогда я получу пару проблем:
Как мне сгруппировать их и передать в ViewModel в View?
Объектами являются Программа, ProgramSkill и Консультант, где между Программой и Консультантом существует отношение «многие ко многим», а ProgramSkill - это таблица соединений (необходима, поскольку она имеет дополнительное свойство «Уровень»).
И если бы у меня было выражение Linq, чтобы сгруппировать их в соответствии с этим, и я мог бы превратить его в ViewModel, которую может использовать представление, как бы я снова обновил модель после отправки обратно в контроллер?
Кажется, код станет намного сложнее, если это вообще можно будет сделать, просто для классификации элементов ProgramSkill по Program.Category. Но в то же время представление будет иметь очень плохое удобство использования, если элементы не будут классифицированы ...
Кто-нибудь знает хорошее решение для этого?