当未呈现复选框时,带有复选框的集合的模型验证失败
Model Validation on collection with checkbox fails when checkbox not rendered
当我的索引视图显示 2 个人并且选择了 none 人时,由于 .NET 4.5 中的 MinLengthAttribute,模型验证工作正常。
现在 ui 中出现了我的自定义逻辑。当 Index 视图中只显示一个人时,我不需要复选框来选中它。客户可以直接按下提交按钮。我尝试手动填充 SelectedIds 数组,请参阅 @else 子句。
但是这段代码:Model.SelectedIds = new int[]{ item.PersonId};
不起作用,服务器端的 viewmodel.SelectedIds 属性 操作始终是 {int[0]}
如何仍然将一个人的 ID 分配给 SelectedIds 数组?
VIEW
@model ListTest.Models.PeopleListViewModel
@{
var hasMoreThanOnePerson = @Model.People.Count > 1;
}
@Html.BeginForm("Save", "Home")
{
@Html.ValidationSummary(false)
<table>
@foreach (var item in Model.People)
{
<tr>
@if (hasMoreThanOnePerson)
{
<td>
<input type="checkbox" name="SelectedIds" value="@item.PersonId" />
</td>
}
else
{
Model.SelectedIds = new int[]{ item.PersonId};
}
<td>
<input type="text" value="@item.Name" />
</td>
</tr>
}
</table>
<input type="submit" value="Save" />
}
VIEWMODEL
public class PeopleListViewModel
{
public PeopleListViewModel()
{
SelectedIds = new int[] { };
}
[MinLength(1, ErrorMessage = "Minimum one person must be selected!")]
public int[] SelectedIds { get; set; }
public List<Person> People { get; set; }
}
控制器
public ActionResult Index()
{
var people = new List<Person> {
new Person { Name = "Horst", PersonId = 10 },
new Person { Name = "Michael", PersonId = 20}
};
return View(new PeopleListViewModel { People = people });
}
[HttpPost]
public ActionResult Save(PeopleListViewModel viewModel)
{
if (ModelState.IsValid)
{
}
viewModel.People = new List<Person> { new Person { Name = "Horst", PersonId = 10 }, new Person { Name = "bernarnd", PersonId = 20 } };
return View("Index", viewModel);
}
您可能会考虑在这种情况下呈现隐藏字段以确保将此值发送回您的服务器:
@if (hasMoreThanOnePerson)
{
<td>
<input type="checkbox" name="SelectedIds" value="@item.PersonId" />
</td>
}
else
{
@Html.Hidden("SelectedIds", item.PersonId)
}
但显然更好的方法是在服务器上处理这个问题——这意味着如果视图模型中没有分配值,您只需从后端取回它,因为用户没有机会在 UI 中修改此值,因为没有他可以操作的相应输入元素。
当我的索引视图显示 2 个人并且选择了 none 人时,由于 .NET 4.5 中的 MinLengthAttribute,模型验证工作正常。
现在 ui 中出现了我的自定义逻辑。当 Index 视图中只显示一个人时,我不需要复选框来选中它。客户可以直接按下提交按钮。我尝试手动填充 SelectedIds 数组,请参阅 @else 子句。
但是这段代码:Model.SelectedIds = new int[]{ item.PersonId};
不起作用,服务器端的 viewmodel.SelectedIds 属性 操作始终是 {int[0]}
如何仍然将一个人的 ID 分配给 SelectedIds 数组?
VIEW
@model ListTest.Models.PeopleListViewModel
@{
var hasMoreThanOnePerson = @Model.People.Count > 1;
}
@Html.BeginForm("Save", "Home")
{
@Html.ValidationSummary(false)
<table>
@foreach (var item in Model.People)
{
<tr>
@if (hasMoreThanOnePerson)
{
<td>
<input type="checkbox" name="SelectedIds" value="@item.PersonId" />
</td>
}
else
{
Model.SelectedIds = new int[]{ item.PersonId};
}
<td>
<input type="text" value="@item.Name" />
</td>
</tr>
}
</table>
<input type="submit" value="Save" />
}
VIEWMODEL
public class PeopleListViewModel
{
public PeopleListViewModel()
{
SelectedIds = new int[] { };
}
[MinLength(1, ErrorMessage = "Minimum one person must be selected!")]
public int[] SelectedIds { get; set; }
public List<Person> People { get; set; }
}
控制器
public ActionResult Index()
{
var people = new List<Person> {
new Person { Name = "Horst", PersonId = 10 },
new Person { Name = "Michael", PersonId = 20}
};
return View(new PeopleListViewModel { People = people });
}
[HttpPost]
public ActionResult Save(PeopleListViewModel viewModel)
{
if (ModelState.IsValid)
{
}
viewModel.People = new List<Person> { new Person { Name = "Horst", PersonId = 10 }, new Person { Name = "bernarnd", PersonId = 20 } };
return View("Index", viewModel);
}
您可能会考虑在这种情况下呈现隐藏字段以确保将此值发送回您的服务器:
@if (hasMoreThanOnePerson)
{
<td>
<input type="checkbox" name="SelectedIds" value="@item.PersonId" />
</td>
}
else
{
@Html.Hidden("SelectedIds", item.PersonId)
}
但显然更好的方法是在服务器上处理这个问题——这意味着如果视图模型中没有分配值,您只需从后端取回它,因为用户没有机会在 UI 中修改此值,因为没有他可以操作的相应输入元素。