我正在学习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列表是否不正确。 目前,我正在用已完成或未完成某门课程的用户填写这些列表。
我要实现的目的是允许管理员在列表中选择用户,然后使系统通过电子邮件提醒他们参加课程。这是用于学校作业。 在此先感谢:-)
答案 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)