【问题标题】:What is really the point of ViewBag?ViewBag 的真正意义是什么?
【发布时间】:2013-10-11 14:18:40
【问题描述】:

在理想的“hello world”中,应该将强类型模型传回视图

return View(MyModel);

如果事情变得棘手,我们可以创建一个

视图模型

return View(MyViewModel);

例如

MyViewModel

  1. 我的模特

我可以避免创建整个ViewModel

并部分使用 ViewBag

ViewBag.Foo = Foo;
return View(MyModel);

我意识到我会失去一些强类型功能

(例如智能感知)

在该 ViewBag 的视图中。

这种方法是否草率?反对 MVC 代表什么?

如果是这样,ViewBag 的真正意义是什么?

【问题讨论】:

  • 这是你忘记放入视图模型的东西 ;-)

标签: asp.net-mvc viewbag


【解决方案1】:

据我所知,最有用的用例是带外数据,例如可能在每个页面上显示的消息。操作过滤器可以有条件地将该消息添加到 ViewBag。您可能不想修改每个视图模型类来保存不相关的消息,因为它可能是一个横切关注点。此类消息/小部件的一个示例是 Stack Overflow 中断通知。

我不建议使用 ViewBag 代替 视图模型。模型类方法具有典型的静态类型优势,而且编写类的成本很低。

【讨论】:

  • 非常有趣,现在说得通了。谢谢!
  • 我以前从未见过Stack Overflows outage :)
  • 您不记得 10 月 10 日星期四上午 12:02:00:01 - 12:02:00:02 发生的著名 SO 中断吗? @Murali
  • 我认为这是我们代理服务器的延迟。但我没有看到消息,因为页面本身没有加载:(
  • 他们有时会在维护数据库时宣布短暂的只读周期。
【解决方案2】:

这是一个很好的问题,就个人而言,我真的不认为有任何意义——它所做的只是鼓励“懒惰”的编码。 dynamic 对象有其用途,但是,我不认为 ViewBag 是其中之一,我更愿意使用 ViewData[]/ViewModel 并在那里获得类型安全,尤其是当我 知道我在处理什么类型。

【讨论】:

  • viewdata 不再是类型安全的
【解决方案3】:

我还没有遇到过使用 ViewBag 而非替代方案(结构正确的视图模型)有益的情况。其他一些答案提到将其用于需要在每个页面上显示的数据。在这种情况下,您应该创建一个所有 ViewModel 都继承自的基本 ViewModel 类。我使用这个结构来存储登录的用户等。

在我看来,ViewBag 有一个目的:在编写最少的代码的同时轻松快速地提供 ASP.NET MVC 的产品演示。这不是构建代码的最佳方式,但它可以销售产品。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2017-05-06
    • 2012-03-30
    • 2011-10-10
    • 2012-08-03
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多