Проблемы с привязкой данных от формы к модели метода действия. Список <SelectListItem>используется в ViewModel - PullRequest
0 голосов
/ 02 мая 2019

Я изучаю ASP.Net MVC Core и у меня возникают некоторые проблемы с пониманием того, как привязать данные моей формы к параметру метода действия.

Моя ViewModel выглядит следующим образом:

public class RemindUsersViewModel
    {
        public List<SelectListItem> UsersCompleted { get; set; } 
        public List<SelectListItem> UsersNotCompleted { get; set; }
        public Course Course { get; set; }
    }

И моя форма выглядит следующим образом:

@model List<RemindUsersViewModel>
...
@foreach (var e in Model)
{
..
<form asp-controller="ManageCourse" asp-action="RemindUsers" method="post">

    <ul>
        @for (int i = 0; i < e.UsersNotCompleted.Count; i++)
        {
            <li>
                <div>
                    <label>
                        <input type="checkbox" asp-for="@e.UsersNotCompleted[i].Selected" />
                        <span>@e.UsersNotCompleted[i].Text</span>
                    </label>
                </div>
                <input type="hidden" asp-for="@e.UsersNotCompleted[i].Text" />
            </li>
        }
        <li>
            <button type="submit">Send reminder</button>
        </li>
    </ul>

</form>


}

И в фиддлере я вижу эти значения, опубликованные в теле после выбора 2/2 пользователей и отправки:

e.UsersNotCompleted[2].Text =   robert@gud.se
e.UsersNotCompleted[2].Selected =   false
e.UsersNotCompleted[2].Selected =   true
e.UsersNotCompleted[1].Text =   robban@mail.se
e.UsersNotCompleted[1].Selected =   true
e.UsersNotCompleted[1].Selected =   false
e.UsersNotCompleted[0].Text =   test@test.se
e.UsersNotCompleted[0].Selected =   false
e.UsersNotCompleted[0].Selected =   true

Как быя иду вперед, чтобы связать эти значения в моем методе действия правильно?Или я должен изменить мой ViewModel?Я не уверен, неправильно ли иметь список моей ViewModel. В настоящее время я заполняю эти списки пользователями, которые завершили или не завершили определенный курс.

Чего я пытаюсь достичьпозволяет администратору выбирать пользователей в списке, а затем заставлять систему напоминать им по электронной почте о прохождении курса.Это для школьного задания.Заранее спасибо: -)

1 Ответ

0 голосов
/ 02 мая 2019

Стандартная практика состоит в том, чтобы передать в представление одну ViewModel.Не список ViewModels.

Итак, если я правильно понимаю ваши требования, я думаю, что ваше представление должно выглядеть следующим образом:

@model RemindUsersViewModel
...

<form asp-controller="ManageCourse" asp-action="RemindUsers" method="post">

    <ul>
        @for (var i = 0; i < Model.UsersNotCompleted.Count; i++)
        {
            <li>
                <label>
                    <input asp-for="UsersNotCompleted[i].Selected" />
                    <span>@Model.UsersNotCompleted[i].Text</span>
                </label>
                <input type="hidden" asp-for="UsersNotCompleted[i].Text" />
            </li>
        }
        <li>
            <button type="submit">Send reminder</button>
        </li>
    </ul>

</form>

И подпись действия контроллера будет:

public IActionResult RemindUsers(RemindUsersViewModel model)

ОБНОВЛЕНИЕ, основанное на вашем ответе:

Вы можете изменить свою ViewModel на:

public class RemindUsersViewModel
{
    public List<CourseModel> Courses { get; set; }        
}

public class CourseModel
{
    public List<SelectListItem> UsersCompleted { get; set; } 
    public List<SelectListItem> UsersNotCompleted { get; set; }
    public Course Course { get; set; }
}

Затем сохранить исходную структуру вашего представления с двойным циклом for.Внешний цикл будет проходить через Courses, а внутренний цикл будет проходить через UsersNotCompleted.

Обратите внимание, что на вашей странице будет несколько форм.Когда вы отправляете отдельную форму, она должна отправлять подпись действия, которая выглядит следующим образом: public IActionResult RemindUsers(RemindUsersViewModel model)

...