1

我正在尝试学习 ASP.NET MVC,并且在我们公司遇到了一些使用 ViewBag 的代码。我研究了它是什么,它似乎只是一个变量容器,可以在控制器中声明然后从视图中访问。

我使用过其他框架,例如 Ruby on Rails 和 Struts,但它们不会让我这样做。特别是在 ruby​​ on rails 中,我可以通过以下方式在视图中轻松调用 get 变量:

 <%= variable %>

进一步的研究使我相信不鼓励使用 ViewData 和 ViewBag。有人可以解释直接从控制器获取变量的用法吗?

谢谢。

4

2 回答 2

4

在 ASP.NET MVC 中,您必须将视图所需的数据从控制器显式传递给视图。

鼓励这样做的方法是使用强类型视图并以类实例的形式传递数据:

public ActionResult MyAction() {
    return View(new MyViewModel { Prop1 = "Value1", ... });
}

在您的视图中,您指定视图使用的模型类:

@model MyViewModel

ViewData 和 ViewBag 是将数据传递给视图的替代/历史方式。ViewData 是一个字典,需要类型转换才能从中获取值。ViewBag 是一个动态对象。两者都缺乏强输入视图所带来的好处。

ViewData 有一些其他属性可以访问模型元数据或模型状态。ViewData.ModelMetadata例如参见。

有人可以解释直接从控制器获取变量的用法吗?

是的,脱钩。MVC 模式指出,视图不依赖于控制器。当您的视图可以访问控制器的属性时,它将耦合到该特定控制器,并且 MVC 中的M已经消失。

于 2013-05-06T14:32:45.827 回答
2

ViewBag 和 ViewData 都旨在维护 View/Controller 解耦。通常适合 ViewModel 的数据可以放在 ViewBag 或 ViewData 中以供视图使用。例如,选择列表数据之类的数据不一定特定于视图。

ViewBag 和 ViewData 之间的区别在于视图数据作为键/值容器(字典)访问,其中 ViewBag 中的数据通过属性访问(它是一个动态对象,因此将新值分配给“属性”创建属性)。

更新:

当您使用时,<%= variable %>您正在访问特定视图上的变量。为了让控制器设置这个值,它必须耦合到视图并直接分配它。这当然是可能的,但会直接将耦合引入您可能不想要的视图。

于 2013-05-06T14:30:50.680 回答