2009-06-17 26 views
8

我一直在阅读专业ASP.NET MVC 1.0书籍,以及阅读其他来源谈论使用ViewModel而不是从您的控制器内的ViewData视图。但是后来我看到很多ViewData的例子被用在那些艰难的情况下,在没有其他方式的情况下,只能从ViewData中获取某些东西。但后来我读了一本像Pro ASP.NET MVC Framework的书,他所谈论的只是ViewData,与ViewModel无关。那么ViewModel是一个非常新的概念还是什么?要使用ViewData或不使用ViewData

我看到ViewModel是一个更好的方法,但它是一个坚实的选择?我的意思是ViewData很容易在其他之类的东西中使用,例如ViewModel不支持的HtmlHelper对象。或者例如在自定义控件中使用它(http://www.codeproject.com/KB/custom-controls/MVCCustomControls.aspx)。那么,我是否会根据不同的目标或者什么使用两者的组合?如果我想在任何原因下访问我的扩展方法中的ViewModel,该怎么办?我在这里失去了要走的路。我知道ViewData不是强类型的,但你可以设置你的视图来指定类型,因此使你的ViewData类型,但我只是想知道。对ViewData有如此多的支持,但我知道ViewModel是一种更加抽象和分离的方式,以及它被输入的方式。我只是不想在需要获取某些数据的场景中缩短自己,例如可以从其他对象(如HtmlHelper类)轻松访问的ViewData。

想法?标准是什么?经验?我关了一下,还是只是使用组合,在其他情况下仍然使用ViewData,而不仅仅是将数据从Controller发送到View或什么?

,如果你是不是在所有使用的ViewData,而是使用视图模型与你的控制器,这似乎是在一个全有或全无您使用视图模型,因此ViewData的没有目的,因为你还没有与任何设置在从你的控制器,所以它在这一点上没有用处?我在这里困惑任何人或方式?当然,把自己搞糊涂了。

回答

2

那么,ViewData是一个非常快速的实现方法。然而,你在做大量的字符串字面传递,这通常不是一件好事。你可以通过使用一些字符串常量来解决这个问题,这就是我对Session变量所做的事情,但我认为在这里ViewModel是一个更好的方法。任何时候你可以使用ViewData,你也可以使用ViewModel。 ViewModel不一定只是你的域对象;它可能是一个助手类,它不仅有一个域对象,而且还有一些特定于视图的额外属性;这就是为什么它在那里。因此,使用ViewModel,编译器可以帮助您从面向对象的角度明确地帮助您,而且它不仅仅是将密钥传递到字典中,而是更加清晰。

我认为MVC在这里提供了一个很好的方法。它为那些需要“完成它”和更简洁的方法的人提供了快速和肮脏(不一定是坏事),而且这两种方法都非常易于使用。

如果您还没有阅读Scott Gurthie的ASP.NET MVC教程;我强烈建议:

http://weblogs.asp.net/scottgu/archive/2009/04/28/free-asp-net-mvc-nerddinner-tutorial-now-in-html.aspx

+0

我不是在谈论ViewData.Model。我正在讨论在视图和控制器“视图模型”之间存在的额外层类,它们负责从模型中获取特定对象,以便控制器可以使用它们而不是控制器从模型层抓取项目。 – PositiveGuy 2009-06-17 13:45:48