似乎有多种方法可以将模型数据从asp.net mvc中的控制器传递到视图。我不清楚在mvc v1和v2版本中是否有推荐的方法,或者是否像生活中的大多数事情一样,这取决于。我已经看到了几种方法:
选项1-通过在视图中强制转换,或者通过创建一个强类型的自定义模型类并通过ViewData传递,以一种复杂的基于字符串的索引方式来填充控制器的ViewData dixtionary。
选项2-使用ViewData.Model,我甚至不确定我是否理解它。
选项3-使用ViewPage.Model,在这种情况下,我不确定如何从控制器传递模型数据。
我看过很多帖子对选项1和选项2大加抨击,但我不明白为什么。这些帖子似乎在大多数情况下都强烈推荐3。
你是如何实现这一点的?有没有标准的方法?
发布于 2010-08-10 06:35:53
每个视图“应该”都有一个特定的模型。这有时是更多的工作,所以人们使用像ViewData这样的捷径,它是有效的,但在我看来就是不那么干净和类型安全,所以我更喜欢在视图的模型中包含所有内容。
然后,您可以将所有视图都严格键入。这是一种非常干净的方式。然后在您的控制器中,您只需调用视图,如下所示:
YourViewModel model = new YourViewModel()
{
// initialize the data here
};
View(model);然后,在您的视图中,您可以通过ViewPage Model访问所有数据,并且它是类型安全的,并且也可以从控制器强制执行。
从评论编辑:
如果你不想要,你根本不需要使用ViewData。您可以将视图所需的所有数据封装在一个模型中。就像您在ProductsListViewData中引用的示例一样。它只是一个包含要存储在ViewData中的所有项的模型。这两种方法都有效,但当您将其封装在一个类中时(首选方法,其中所有内容都在模型中),那么所有的部分都是强类型的。
ViewData是一个通用的容器,所以即使你可以在里面放任何你想放的东西,它也不是类型安全的,因此不是“干净”的。归根结底是偏好和可维护性。只有选项1和选项3。你的选项2被误解了,实际上就是选项3。只有ViewPage.Model,没有ViewData.Model。
发布于 2010-08-10 12:01:58
当视图变得更加复杂时,您可能希望考虑的一种方法是将模型用于输入字段,并使用ViewData来支持视图需要呈现的任何其他内容。
至少有几个论据可以支持这一点:
根据我的经验,我发现这种方法效果很好。
而且,在MVC3中,dynamic ViewModels意味着不再有字符串索引!
发布于 2010-08-10 06:39:25
https://stackoverflow.com/questions/3444688
复制相似问题