无法将数据从表单绑定到动作方法模型。 ViewModel

时间:2019-05-02 13:38:08

标签: c# forms asp.net-core-mvc model-binding selectlistitem

我正在学习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 :(得分:0)

标准做法是将单个ViewModel传递给视图。不是ViewModel的列表。

因此,如果我正确理解了您的要求,我认为您的观点应该像这样:

@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; }
}

然后使用double for循环保留视图的原始结构。外循环将循环Courses,内循环将循环UsersNotCompleted

请注意,页面上将有多种形式。提交单个表单时,应将其张贴到看起来像public IActionResult RemindUsers(RemindUsersViewModel model)

的动作签名上