我正在努力重构MVC项目来清理控制器,方法是使用操作过滤器在ModelState
无效时执行PRG(重定向后获取),并将ModelState
存储在{在重定向期间{1}}。
我有一个看起来像这样的视图模型:
TempData
控制器操作:
public class GroupMember
{
public string UserId { get; set; }
public bool SendNotifications { get; set; }
}
public class Group
{
public int Id { get; set; }
public string Name { get; set; }
// ...
public List<GroupMember> Members { get; set; }
}
我遇到的问题是在重定向后让集合[HttpGet]
[ImportModelState]
public ActionResult Create()
{
var model = new Group();
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
[ValidateModelState]
public ActionResult Create(
[Bind(Exclude = "Id")]
Group model)
{
// call service to save
// ...
}
正确显示。 Group.Members
已正确加载,并且适用于ModelState
等属性,其中被调用Group.Name
加载来自Html.EditorFor(...)
的数据,而不是使用(空)模型
我有ModelState
的编辑器模板(除了重定向方案以外的所有工作都正常)并且使用GroupMember
显示集合,但显然MVC 不检查在这种情况下Html.EditorFor(model => model.Members)
,因此它始终显示一个空列表。
有没有一种干净的方法来解决这个问题?我想我应该能够在隐藏字段中存储成员数量并手动检查它是否具有ModelState
中的值,但这似乎是一种笨拙的解决方法。
编辑:
我提出的解决方法是将属性ModelState
添加到NumMembers
,并将以下内容插入到Razor视图中:
Group
我的javascript代码修复了正确的模型绑定的项索引,在帖子之前更新了NumMembers隐藏字段。仍然希望有一个更清洁的解决方案。
答案 0 :(得分:0)
没有简单的解决方法。你应该使用隐藏字段。