2011-03-25 67 views
3

我有一个视图,显示来自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项目进行分类。但同时,如果物品未分类,视图将具有非常差的可用性...

任何人都知道一个很好的解决方案吗?

回答

0

我想你想要做的是添加其他视图模型

ProgramSkillsModel 
{ 
    string Category {get;set;} 
    IList<ProgramSkill> Skills {get;set;} 
} 

然后在你的控制器指数()

ProgramsViewModel vm = new ProgramsViewModel();   
vm.ProgramSkills = consultant.ProgramSkills.GroupBy(c => c.Category) 
        .Select(c => new ProgramSkillsModel{ 
Category = c.Key, 
Skills = c.ToList(), 
}); 

希望工程。这只是伪代码