如何在MVC3中的不同Action方法调用之间保留全局变量的值?

Cic*_*ami 15 c# global-variables asp.net-mvc-3

我正在使用Razor和C#开发ASP.NET MVC 3 Web应用程序.

我刚刚发现我对全局变量有一些问题,可能是因为我对MVC相对较新.

我有一个带有一些全局变量和动作方法的控制器.我声明了一个全局变量,以便允许操作方法操纵它并将操作反映到所有操作方法.我有以下情况:

public class myController : Controller
{
    private string _MyGlobalVariable;

    public ActionResult Index()
    {
       _MyGlobalVariable = "Hello";
       //other code
       return View("MyView");
    }

    public ActionResult Print()
    {
       _MyGlobalVariable += "Print";

       return View("PrintView", _MyGlobalVariable);
    }
}
Run Code Online (Sandbox Code Playgroud)

打印()动作方法被调用与Html.ActionLink()MyView的视图.

令人惊讶的是_MyGlobalVariable的价值没有保留!所以在指令之前_MyGlobalVariable的值_MyGlobalVariable += "Print"等于null.

我犯了一些错误吗?如何在对Views的调用之间保留全局变量的值?

谢谢

弗朗切斯科

PS:在我的具体情况下,全局变量是一个,Dictionary<K,V>但我想它不会改变逻辑.

PPS:我知道你可以使用的ViewModels而不是全局变量传递的操作方法之间,但在我的情况下的数据要少得多的代码,如果我用一个Dictionary<K,V>通常我不会在包装的ViewModels(我使用波苏斯Lists<T>)

SLa*_*aks 31

每个请求都有一个新的控制器实例.
由于您的"变量"是一个实例字段,因此它不会持久存在.

您可以通过创建static或使用应用程序状态来解决此问题.

但是,不要.
您永远不应该在Web应用程序中使用可变全局状态.

特别是,如果您同时收到两个请求,您的字段将会搞砸.

根据您要执行的操作,您可能希望使用会话状态或Cookie.


cwh*_*ris 6

首先,C#中没有全局变量这样的东西。您正在寻找的是一个静态变量,可以通过类本身访问它。由于每个请求都会创建一个新的控制器实例,因此变量的值会丢失。

您需要这样声明您的变量:

private static string _MyGlobalVariable = "insert default value here";
Run Code Online (Sandbox Code Playgroud)

并按如下方式访问它:

MyControllerClass._MyGlobalVariable
Run Code Online (Sandbox Code Playgroud)

此外,该变量只能从 myController 类的方法访问,因为您已将其声明为私有。

除此之外,您可能希望在使用变量时锁定该变量,因为您最终会遇到竞争条件。

注意:我不建议这样做