当我的索引视图显示2个人并且未选择任何人时,由于.NET 4.5中的MinLengthAttribute,模型验证正常工作。
现在我的自定义逻辑出现在ui中。当索引视图中只显示一个人时,我不需要复选框来检查它。客户可以直接按提交按钮。我尝试手动填充SelectedIds数组,参见@else子句。
但是这段代码:Model.SelectedIds = new int[]{ item.PersonId};
不起作用,服务器端操作的viewmodel.SelectedIds属性始终为{int[0]}
如何仍然将一个人ID分配给SelectedIds数组?
查看
@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" />
}
视图模型
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; }
}
CONTROLLER
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);
}
答案 0 :(得分:0)
在这种情况下,您可以考虑渲染隐藏字段,以确保将此值发送回您的服务器:
@if (hasMoreThanOnePerson)
{
<td>
<input type="checkbox" name="SelectedIds" value="@item.PersonId" />
</td>
}
else
{
@Html.Hidden("SelectedIds", item.PersonId)
}
但显然更好的方法是在服务器上处理这个 - 这意味着如果视图模型中没有分配值,您只需从后端获取它,因为用户没有机会修改它UI中的值,因为他没有可以操作的相应输入元素。