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.
首先,C#中没有全局变量这样的东西。您正在寻找的是一个静态变量,可以通过类本身访问它。由于每个请求都会创建一个新的控制器实例,因此变量的值会丢失。
您需要这样声明您的变量:
private static string _MyGlobalVariable = "insert default value here";
Run Code Online (Sandbox Code Playgroud)
并按如下方式访问它:
MyControllerClass._MyGlobalVariable
Run Code Online (Sandbox Code Playgroud)
此外,该变量只能从 myController 类的方法访问,因为您已将其声明为私有。
除此之外,您可能希望在使用变量时锁定该变量,因为您最终会遇到竞争条件。
注意:我不建议这样做