MVC:将模型/模型数据传递给控制器​​的视图?

Dec*_*ler 5 language-agnostic model-view-controller design-patterns

如果视图需要从模型访问数据,您认为控制器应该:

a)将模型传递给视图
b)将模型的数据传递给视图
c); 它不应该是控制器的关注点.让视图直接访问模型以检索数据.只让控制器提供视图所需的一些参数来过滤模型中的数据.
d)这取决于具体情况.
e)以上都不是,但[...]

谢谢

在评论中对用户删除的答案进行了一些辩论后,可能需要澄清.我对MVC架构的看法偏向于Zend Framework(php),其中默认情况下控制器中的操作具有分配给它的默认视图.因此,模型不是决定哪个视图是合适的,而是控制器.你觉得模型应该决定哪种观点合适吗?我认为让视图基于模型构建的唯一方法是让控制器将模型传递给视图.是否还有其他技术可以让视图在不涉及控制器的情况下访问模型?或者让控制器将模型传递给视图是否完美,以便可以根据模型属性构建视图?

Iai*_*way 10

e)以上都不是; 传递视图优化的"ViewModel".

ASP.NET MVC中的示例: -

public ActionResult Details(int id)
{
  Product p = ProductService.GetProductById(id);

  if(p == null) { return RedirectToAction("Index"); }

  ProductViewModel model = new ProductViewModel(p);
  return View(model);
}
Run Code Online (Sandbox Code Playgroud)

a)和b)"将做"受制于d).永远不会c).

通常,ViewModel只封装模型(如果没有复杂的事情,您的视图可以直接通过ProductViewModel.Product访问模型).如果视图需要对模型执行任何复杂操作,则ViewModel负责执行此操作,而不是Controller或View的职责.

这可以使您的顾虑保持良好和隔离.您的控制器并不关心您的View所需的具体数据(除了它呈现产品的某些细节),或者特别是您的View需要该数据的格式.您的View不依赖于您的View的实现细节模型.您的模型不必关心它的被查看方式.如果您有两个视图呈现产品(例如,创建,编辑,摘要,更多详细信息等),那些视图可以具有不同的ViewModel,以仅公开每个特定视图所需的数据,因此您的视图不依赖于彼此.可爱的:)

从各种观点进一步阅读: -

http://www.thoughtclusters.com/2007/12/datamodel-and-viewmodel/

http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx

http://www.nikhilk.net/Silverlight-ViewModel-MVC.aspx

我认为ViewModels是一个特别的.NET东西,但我认为没有理由为什么这个模式不能在PHP中使用.

希望这可以帮助.