首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您如何决定将模型数据从asp.net mvc控制器传递到视图的方式?

您如何决定将模型数据从asp.net mvc控制器传递到视图的方式?
EN

Stack Overflow用户
提问于 2010-08-10 06:31:15
回答 4查看 170关注 0票数 3

似乎有多种方法可以将模型数据从asp.net mvc中的控制器传递到视图。我不清楚在mvc v1和v2版本中是否有推荐的方法,或者是否像生活中的大多数事情一样,这取决于。我已经看到了几种方法:

选项1-通过在视图中强制转换,或者通过创建一个强类型的自定义模型类并通过ViewData传递,以一种复杂的基于字符串的索引方式来填充控制器的ViewData dixtionary。

选项2-使用ViewData.Model,我甚至不确定我是否理解它。

选项3-使用ViewPage.Model,在这种情况下,我不确定如何从控制器传递模型数据。

我看过很多帖子对选项1和选项2大加抨击,但我不明白为什么。这些帖子似乎在大多数情况下都强烈推荐3。

你是如何实现这一点的?有没有标准的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-10 06:35:53

每个视图“应该”都有一个特定的模型。这有时是更多的工作,所以人们使用像ViewData这样的捷径,它是有效的,但在我看来就是不那么干净和类型安全,所以我更喜欢在视图的模型中包含所有内容。

然后,您可以将所有视图都严格键入。这是一种非常干净的方式。然后在您的控制器中,您只需调用视图,如下所示:

代码语言:javascript
复制
YourViewModel model = new YourViewModel()
{
    // initialize the data here
};
View(model);

然后,在您的视图中,您可以通过ViewPage Model访问所有数据,并且它是类型安全的,并且也可以从控制器强制执行。

从评论编辑

如果你不想要,你根本不需要使用ViewData。您可以将视图所需的所有数据封装在一个模型中。就像您在ProductsListViewData中引用的示例一样。它只是一个包含要存储在ViewData中的所有项的模型。这两种方法都有效,但当您将其封装在一个类中时(首选方法,其中所有内容都在模型中),那么所有的部分都是强类型的。

ViewData是一个通用的容器,所以即使你可以在里面放任何你想放的东西,它也不是类型安全的,因此不是“干净”的。归根结底是偏好和可维护性。只有选项1和选项3。你的选项2被误解了,实际上就是选项3。只有ViewPage.Model,没有ViewData.Model

票数 2
EN

Stack Overflow用户

发布于 2010-08-10 12:01:58

当视图变得更加复杂时,您可能希望考虑的一种方法是将模型用于输入字段,并使用ViewData来支持视图需要呈现的任何其他内容。

至少有几个论据可以支持这一点:

  1. 你有一个母版页,它需要一些数据(例如,像标题中的StackOverflow用户信息)。通过应用站点范围的ActionFilter,可以在每次操作后轻松地在ViewData中填充此信息。要将其放入模型中,需要站点中的每个其他模型都继承一个基本模型(最初这可能看起来不是很糟糕,但它可能很快就会变得复杂)。
  2. 当您验证发布的表单时,如果存在验证错误,您可能希望将模型(具有无效字段)重新绑定到视图,并显示验证消息。这很好,因为输入字段中的数据被回发并将绑定到模型,但是视图需要重新填充的任何其他数据怎么办?(例如,下拉列表值、信息消息等)这些将不会回发,并且在回发的输入值周围将它们重新填充到模型上可能会变得混乱。通常,使用一个用the..view数据填充ViewData的方法会更简单。

根据我的经验,我发现这种方法效果很好。

而且,在MVC3中,dynamic ViewModels意味着不再有字符串索引!

票数 1
EN

Stack Overflow用户

发布于 2010-08-10 06:39:25

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3444688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档