【问题标题】:How to display view model validation for a view that has multiple forms on it?如何为具有多个表单的视图显示视图模型验证?
【发布时间】:2015-02-19 20:16:39
【问题描述】:

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

我正在尝试编写这种模式,但我似乎无法将松散的两端联系在一起。

我在下面编写了一些示例操作方法以及示例视图模型类,我认为这些示例演示了我想要实现的目标。假设我有一个 Item Detail 操作方法和视图。在这个Detail 视图中,我有两个表单——一个创建一个新的Comment,另一个创建一个新的NoteCommentNote 都将 POST 形成为它们自己的操作方法 - DetailNewCommentDetailNewNote

成功时,这些POST 处理程序操作方法可以正常工作。但是,在无效的模型状态下,我返回 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; }
}

【问题讨论】:

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


    【解决方案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 表单,因此您将只向服务器发送相关信息,而不会更改主视图的其余部分。

    【讨论】:

      【解决方案2】:

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

      真的,你只需要做出选择。我已经看到网站以两种方式处理它。就个人而言,我更喜欢重新显示原始表单,这意味着在同一个操作中处理两个表单。它可能导致臃肿,但您可以从操作中分解出很多逻辑,这样您最终会得到大部分只是一个分支,具体取决于提交的表单。

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 2019-11-10
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多