【问题标题】:Group a collection in MVC View and update model in controller?在 MVC 视图中对集合进行分组并在控制器中更新模型?
【发布时间】:2011-03-25 14:22:17
【问题描述】:

我有一个视图,它显示来自 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: 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 中传递给 View?

对象是 Program、ProgramSkill 和 Consultant,其中 Program 和 Consultant 之间存在多对多关系,而 ProgramSkill 是联结表(需要,因为它具有附加属性“Level”)。

如果我有一个 Linq 表达式来根据这个对它们进行分组,并且可以使它成为一个 View 可以使用的 ViewModel,我将如何在发回 Controller 后再次更新模型?

看起来代码会变得更加复杂,如果它可以完成的话,只是为了按 Program.Category 对 ProgramSkill 项目进行分类。但同时,如果item没有分类的话,View的可用性会很差……

有人知道这个的好方法吗?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 group-by


    【解决方案1】:

    我认为你想要做的是添加另一个视图模型

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

    然后在你的控制器中 Index()

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

    希望这行得通。只是伪代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2017-12-13
      • 2014-07-31
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多