ASP.net MVC -每个视图或每个动作一个视图模型
本文关键字:视图 模型 一个 net MVC ASP | 更新日期: 2023-09-27 18:08:34
每个视图或每个控制器操作一个ViewModel是更好的主意吗?
的例子:
public ProjectController : Controller
{
public ActionResult Edit(int id)
{
var project = ...;
return View(new ProjectEditViewModel(project));
}
[HttpPost]
public ActionResult Edit(ProjectEditViewModel model)
{
}
**OR**
[HttpPost]
public ActionResult Edit(Project model)
{
}
[HttpPost]
public ActionResult Edit(ProjectEditPostViewModel model)
{
}
}
这里有三个选项,哪个是最好的?
- 为我的POST/GET动作使用相同的ViewModel
- 为GET操作使用ViewModel,为POST操作使用域模型。
- 为GET和POST使用不同的ViewModel。
为GET和POST操作使用不同的视图模型是最好和最灵活的设计。但是对GET和POST操作使用相同的视图模型在90%的情况下也可以工作,这是一个很好的设计。因此,如果在您的场景中使用相同的视图模型,请不要犹豫,像这样重用它。
在GET和POST操作使用不同视图模型的情况下,这些类之间仍然存在一些关系:继承或组合。
正确答案
既不。没有灵丹妙药,也不应该有。
因此,正确的答案是:使用尽可能多的视图模型,因为您的用户界面进程需要。这与视图或控制器动作无关。有时一个操作需要一个视图,而另一个操作需要一个视图。但不要遵循一些严格的指导方针,这会阻碍你的发展。随着应用程序的开发,视图模型将自然而然地出现。而且应该。否则,您可能会以基于某些准则的不合理视图而告终,这些准则是您已经确定的。
这实际上是一个类似于@DarinDimitrov的回答,但有一个直接的结论。
在Post action中使用不同的模型来接收输入参数(在这种情况下我甚至不称之为ViewModel),而不是将输出参数传递给视图。
对于基本表单,我遵循以下方法:
- GET 的一个视图模型POST的一个视图模型
GET模型继承了POST模型
我经常将域对象传递给GET模型的构造函数,并用它做两件事:- 用域对象的数据填充POST模型属性。
- 将域对象封装为GET模型中的局部变量。我用它来显示域对象中的一些(只读)数据。节省了一点精力。有些人会告诉你不要这样做。