如何为包含多个表单的视图显示视图模型验证?

时间:2015-02-19 20:16:39

标签: asp.net asp.net-mvc forms

我正在努力更好地理解如何正确构建我的ASP.NET MVC代码以处理单个视图包含多个表单的情况。我认为将表单提交给他们自己的操作方法是有意义的,这样每个表单都可以从自己的视图模型参数绑定和验证中受益,并避免将所有表单参数放入一个更大的单片视图模型中。

我正在尝试对这种模式进行编码,但我似乎无法将松散的目标捆绑在一起。

我在下面编写了一些示例操作方法,以及示例视图模型类,我认为这些方法展示了我正在尝试实现的目标。让我们说我有一个Item Detail操作方法和视图。在这个Detail视图中,我有两个表单 - 一个用于创建新的Comment,另一个用于创建新的NoteCommentNote POST形成DetailNewComment个自己的操作方法 - DetailNewNotePOST

成功时,这些View(model)处理程序操作方法可以正常工作。但是,在无效的模型状态下,我返回Detail,以便我可以在原始Brief视图中显示问题。这会尝试呈现名为Detail的视图,而不是View。如果我使用允许我指定要渲染的视图的重载DetailViewModel调用,那么现在我遇到了我正在使用的不同视图模型类的问题。特定视图模型类现在不再适用于原始public ActionResult Detail(int id) { var model = new ItemDetailViewModel { Item = ItemRepository.Get(id) }; return View(model); } [HttpPost] public ActionResult DetailNewComment(int id, ItemDetailNewCommentViewModel model) { if (!ModelState.IsValid) { return View(model); } var comment = CommentRepository.Insert(new Comment { Text = model.Text }); return RedirecToAction("Detail", new { id = id; }); } [HttpPost] public ActionResult DetailNewNote(int id, ItemDetailNewNoteViewModel model) { if (!ModelState.IsValid) { return View(model); } var note = NoteRepository.Insert(new Note { Text = model.Text }); return RedirectToAction("Detail", new { id = id; }); }

我觉得我这样做完全错了。我应该如何使用多种形式处理这种情况?谢谢!

public class ItemDetailViewModel
{
  public Item Item { get; set; }
}

public class ItemDetailNewCommentViewModel
{
  public string Text { get; set; }
}

public class ItemDetailNewNoteViewModel
{
  public string Text { get; set; }
}

......视图模型类似......

{{1}}

2 个答案:

答案 0 :(得分:1)

对于你的情况,我建议你有一个主模型 ItemDetailViewModel类,您将为每个子模型添加属性

public class ItemDetailViewModel
{
  public Item Item { get; set; }
  public ItemDetailNewCommentViewModel NewCommentModel {get;set;}
  public ItemDetailNewNoteViewModel NoteModel {get;set;}
}

您的详细信息视图将是主视图,其他两个视图将是部分视图。 主视图将接收ItemDetailViewModel的实例作为模型,在内部视图中,您将通过传递Model.NewCommentModel和Model.NoteModel作为其对应的模型来呈现您的部分。为了能够为每个表单使用单独的操作,您可以使用ajax表单而不是常规表单,因此您只会向服务器发送相关信息而不会更改主视图的其余部分。

答案 1 :(得分:0)

这里的主要问题是当用户搞砸并且他们的帖子没有通过验证服务器端时会发生什么。如果您选择将它们带到只显示一个表单的页面,那么您可以发布到其他操作,但如果您希望重新显示这两个表单,那么它们都应该指向相同的操作。

真的,你只需要做出选择。我看过网站都处理它。就个人而言,我更喜欢重新显示原始表单,这意味着在同一个动作中处理两个表单。它可以导致膨胀,但是你可以从动作中分解出很多逻辑,这样你最终只能根据提交的表单来分支。