2013-05-06 52 views
1

我试图学习ASP.NET MVC,我在我们公司遇到了一些使用ViewBag的代码。我研究过它是什么,它看起来像是一个变量的容器,可以在控制器中声明,然后从视图中访问。ASP.NET MVC的新手,我不明白使用ViewData和/或ViewBag

我已经使用了其他的框架,比如Ruby on Rails和Struts,它们不会让我这么做。在特别导轨红宝石,我可以做调用get变容易的观点:

<%= variable %> 

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

谢谢。

+0

首先,您正在使用ASP.NET MVC。它不同于ASP.NET – 2013-05-06 14:20:56

+0

@ManishMishra我认为有ASP.NET MVC和ASP.NET Web Forms。但是,这是MVC。 – user1287523 2013-05-06 14:22:42

+1

看看[这个](http://stackoverflow.com/questions/8328083/heavy-use-of-viewbag)和[this](http://stackoverflow.com/questions/4766062/is-using-viewbag- in-mvc-bad)帮助你 – 2013-05-06 14:24:47

回答

4

在ASP.NET MVC中,您必须明确地将视图需要的数据从控制器传递到视图。

这样的鼓励方式是使用强类型的视图和一个类实例的形式传递数据:

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

您认为您指定的视图使用模型类:

@model MyViewModel 

ViewData和ViewBag是将数据传递到视图的备用/历史方式。 ViewData是一个字典,需要通过类型转换才能获取值。 ViewBag是一个动态对象。两者都缺乏从强烈输入视图中获得的好处。

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

有人可以解释它的使用,而不是直接从控制器获取变量吗?

是的,去耦。 MVC模式表明,View对控制器没有依赖性。当您的视图可以访问控制器的属性时,它将耦合到该特定的控制器,并且MVC中的消息已经消失。

2

ViewBag和ViewData都是为了维持视图/控制器的解耦。通常适合ViewModel的数据可以放置在视图中使用的ViewBag或ViewData中。例如,选择列表数据之类的数据不一定是特定的。

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

更新:

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

+1

正确,但为什么没有'<%= variable%>'? – 2013-05-06 14:31:52

+2

将其放入ViewBag/ViewData而不是ViewModel的动机是什么? – user1287523 2013-05-06 14:32:04

+0

@ user1287523更少的代码,更多的*动态*如果您更喜欢过度安全 – Jan 2013-05-06 14:33:40