ASP新手.. NET MVC,我不理解ViewData和/或ViewBag的使用

本文关键字:ViewBag ViewData NET 新手 MVC 不理解 ASP | 更新日期: 2023-09-27 18:12:23

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

我使用过其他框架,如Ruby on Rails和Struts,它们不会让我这样做。特别是在ruby on rails中,我可以简单地在视图中调用get变量:

 <%= variable %>

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

谢谢。

ASP新手.. NET MVC,我不理解ViewData和/或ViewBag的使用

你必须显式地将视图需要的数据从控制器传递给视图。

建议使用强类型视图并以类实例的形式传递数据:

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

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

@model MyViewModel

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

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

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

是的,解耦。MVC模式表明,视图不依赖于控制器。当你的视图可以访问控制器的属性时,它就会耦合到那个特定的控制器,MVC中的M就消失了。

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

ViewBag和ViewData之间的区别在于视图数据是作为键/值容器(字典)访问的,而ViewBag中的数据是通过属性访问的(它是一个动态对象,所以给一个"属性"分配一个新值;创建属性).

<标题>更新:

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