如何在ASP.NET MVC中处理控制器和视图之间的共享数据?

时间:2010-12-14 11:16:01

标签: c# asp.net-mvc design-patterns

我们有一个模型(比如,List<string>)。构建列表的函数是非确定性的,并且在请求的生命周期内需要在控制器和视图中引用输出。由于它是按请求,因此不能是静态或单独的。

这是一个常见的结构,可以从任何视图或控制器中引用。

由于我们无法从视图中访问控制器(原则上,我们同意),因此我们无法将其保留在控制器中。我们目前将它保存在ViewData字典中并在控制器或视图中初始化(如果控制器不需要它)。

我们认为为此目的使用ViewData可能并不理想,因为它不会被创建为首先由控制器使用。有没有更好的方法在Controller和View之间共享每个请求的公共数据?如果不是,我们会坚持使用ViewData

HttpContext.Items字典,但我不确定它是否适合此目的。

3 个答案:

答案 0 :(得分:1)

  

在请求的生命周期内,需要在控制器和视图中引用输出

MVC的工作方式,执行Controller中的Action代码,并将结果数据传递给视图引擎,该引擎使用您通过调用View(数据)或ViewData字典传递的信息来绘制页面

我不知道你想要做什么,但听起来这更像是一种不好的方法而不是技术问题(不过我可能错了)。

你能解释为什么在渲染视图时你需要控制器吗?如果你需要任何与List关联的逻辑(处理它或用它做任何事情),我只需创建一个扩展List&lt; T&gt;的新类,将逻辑添加到该类而不是控制器,并传递一个对象使用View()或ViewData []。

将视图添加到视图中

答案 1 :(得分:0)

应始终首先调用控制器操作。如果您有多个控制器调用相同的视图/局部视图,那么您应该将代码重构为一个方法并调用它。

ViewData是执行此操作的解决方案,如果您真的想要“一次访问”类型信息,那么可能是TempData,但ViewData就是为此设计的。

答案 2 :(得分:0)

你要做的确切事情是什么?

好像你只是问一下将一些数据从Controller传递到View的方法,这是一项相当简单的任务。只需在MVC3案例中使用ViewData,yes或ViewBag,或使用ViewModels。

还是有些特殊情况? “从Controller和View中引用”是什么意思?数据来自哪里?通常情况是Controller为View准备数据并将其作为ActionResult(或更好,作为ViewModel)传递。 View永远不应绕过控制器自行获取一些数据。