在我当前的MVC2项目中,我通过创建一个“模型”类来实现我的MVC,该类从数据库收集数据并通过业务逻辑等运行它。然后我有一个“控制器”从模型中获取处理过的数据设置“ViewData”类中的值。这个“ViewData”类是一类getter和setter。然后将此ViewData传递给Controller中的视图,如下所示:return View(myViewData);
。最后,在View中,我通过将此行放在我的aspx文件的顶部来引入存储在ViewData中的数据。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Core.UI.Web.ViewData.MyViewData>" %>
那么,这是MVC3的完成方式吗?我的开发团队中有一个人建议应该通过Controller将模型直接发送到这样的视图:return View(myModel);
。他的理由是这是MVC而不是M.V.VM.C。
我知道可以使用ViewBag,但这看起来像是一个快速的数据容器。
换句话说,所以,换句话说。 ViewData还是没有ViewData?谢谢,
亚伦
答案 0 :(得分:0)
在某些情况下,您可能需要视图模型:组合来自多个模型/源的数据,或用于特定的验证方案等,但是,在没有中间视图模型的情况下让视图采用模型是完全可以接受的,特别是如果视图模型只是一类没有其他功能的getter和setter。
如果您不关心从域模型中暴露方法/属性(或者如果它不适用),我只需将模型直接传递给控制器。
答案 1 :(得分:0)
在您的实例中,ViewData只是一个模型 - 它是一个ViewModel并且非常精细,实际上是一般使用的推荐方法。例如,你不想要的原因是,在“创建客户”功能的情况下呈现的客户模型中的主键 - 作为客户ID尚不存在。但是,要编辑客户记录,您肯定需要一个密钥。所以 - 如果你在某些情况下使用viewmodels而不是在其他情况下使用viewmodels,那么你的项目就不一致了。
'是'你可以 - 但我更喜欢一致性,使用视图模型可以提供一致性。
您也可以使用该模型 - 这通常是MVC演示的设置方式,但不幸的是,大多数演示都不会给您提供最具建筑效果的内容,但最好是将5分钟的应用程序组合在一起。< / p>
答案 2 :(得分:0)
正如其他人所说的那样,尽管你可以通过将模型传递给你的视图,但是你会发现自己想要为显示目的添加属性而不是完全属于模型(例如,值依赖于当前的会话,而不是模型本身。)当你达到这一点时,通常很快你就会很高兴你使用了viewModels。
从技术上讲,ASP.NET MVC甚至不使用MVC,而是使用Model2。 Dino Esposito有a good article about this。此外,在他的书“Microsoft .NET:为企业架构应用程序”中,他甚至说:
“这是一个尖锐而大胆的声明,但我们必须做到:今天经典的MVC已经消失。但是,它的一些变化是健康和繁荣的。它们是Web的Model2和Web和Windows的MVP。反过来,直到最近,MVP才进行了改版。2006年7月,Martin Fowler提议完全退出MVP并用两种不同的Passive View(PV)和监督控制器(SVC)取而代之。“
我写了一篇关于本章的评论on my blog。