【发布时间】:2015-02-19 20:16:39
【问题描述】:
我试图更好地理解如何正确构建我的 ASP.NET MVC 代码以处理单个视图包含多个表单的情况。我觉得将表单提交给自己的操作方法是有意义的,这样每个表单都可以从自己的视图模型参数绑定和验证中受益,并避免将所有表单参数放入一个更大的单体视图模型中。
我正在尝试编写这种模式,但我似乎无法将松散的两端联系在一起。
我在下面编写了一些示例操作方法以及示例视图模型类,我认为这些示例演示了我想要实现的目标。假设我有一个 Item Detail 操作方法和视图。在这个Detail 视图中,我有两个表单——一个创建一个新的Comment,另一个创建一个新的Note。 Comment 和 Note 都将 POST 形成为它们自己的操作方法 - DetailNewComment 和 DetailNewNote。
成功时,这些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