从ModelState

时间:2015-12-22 17:41:22

标签: c# asp.net-mvc asp.net-mvc-5

我正在努力重构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隐藏字段。仍然希望有一个更清洁的解决方案。

1 个答案:

答案 0 :(得分:0)

没有简单的解决方法。你应该使用隐藏字段。