Группировать коллекцию в MVC Посмотреть и обновить модель в контроллере? - PullRequest
3 голосов
/ 25 марта 2011

У меня есть представление, которое отображает коллекцию из 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. Но в то же время представление будет иметь очень плохое удобство использования, если элементы не будут классифицированы ...

Кто-нибудь знает хорошее решение для этого?

1 Ответ

0 голосов
/ 22 июня 2011

Я думаю, что вы хотите сделать, это добавить другую модель представления

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(),
});

Надеюсь, это сработает.Это просто псевдокод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...