ASP.NET MVC全局变量


74

如何在ASP.NET MVC中声明全局变量?


1
您的答案是-[
MVC-

@SLaks当您要为客户端创建快速而肮脏的原型时,这非常有用。当您制作一次性的预售UI演示时,不良的设计和不良做法根本不重要。
罗马诺扎

Answers:


50
public static class GlobalVariables
{
    // readonly variable
    public static string Foo
    {
        get
        {
            return "foo";
        }
    }

    // read-write variable
    public static string Bar
    {
        get
        {
            return HttpContext.Current.Application["Bar"] as string;
        }
        set
        {
            HttpContext.Current.Application["Bar"] = value;
        }
    }
}

为什么要使用Application类?应用程序对象用于与较旧的ASP兼容。微软还说:“这可以提高性能,因为访问静态变量的速度比访问应用程序字典中的项的速度快”。资料来源:链接
MarisB。12年

@wishmesh:同意。另一方面-如果打开基于数据库的状态机,是否将保存静态变量?
abatishchev'5

1
你是对的。似乎“静态变量方法”在网络花园和其他情况下可能会失败。
Maris B.

@abatishchev为什么不在Global.asax中定义变量?,访问变量时,您对每个请求都进行了异常的类型转换。
Anirudha Gupta

@Gupta:基本上,HttpContext和Global.asax都是遗留方法。通常,静态变量是更好的变量。但是每个都有优点和缺点,请参阅上面的评论。但是最终您应该没有共享变量,HTTP是无状态的,因此您的代码也应该如此。
abatishchev

78

从技术上讲,项目中任何位置上类的任何静态变量或Property都将是Global变量,例如

public static class MyGlobalVariables
{
    public static string MyGlobalString { get; set; }
}

但是,正如@SLaks所说,如果处理不当,它们可能“是不好的做法,并且很危险”。例如,在上面的示例中,您将有多个请求(线程)试图访问相同的Property,如果它是复杂类型或集合,则可能是个问题,您将必须实现某种形式的锁定。


9
我的投票 实际上,根据Microsoft的说法,这是一种首选方法-由于性能原因,使用全局变量(静态)。并且Application对象用于与旧的ASP兼容。在此处了解更多信息:链接。如果考虑线程安全性和并发性,则AFAIK静态和Application都需要锁,因为如果Application是线程安全的,则访问的数据可能不是。
Maris B.

静态类不是会话安全的,即。同时,来自2个用户的2个同时请求将共享相同的变量,因此这将使数据混乱。为了确保用户会话安全,我认为必须提到abatishchev。
Vasil Popov 2012年

我同意@Sunday,我认为这应该标记为正确答案,但是,实现此目标的最佳方法是实现线程安全的单例模式,例如:csharpindepth.com/Articles/General/Singleton.aspx
Tohid

那是最好的答案。
Matheus Miranda

24

您可以将它们放入应用程序中:

Application["GlobalVar"] = 1234;

它们仅在当前IIS /虚拟应用程序中是全局的。这意味着,在Webfarm上,它们对于服务器而言是本地的,并且在作为应用程序根目录的虚拟目录中。


18

对于非静态变量,我通过Application类字典对其进行了分类,如下所示:

在Global.asax.ac:

namespace MvcWebApplication 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
        private string _licensefile; // the global private variable

        internal string LicenseFile // the global controlled variable
        { 
            get 
            { 
                if (String.IsNullOrEmpty(_licensefile)) 
                { 
                    string tempMylFile = Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(typeof(LDLL.License)).Location), "License.l"); 
                    if (!File.Exists(tempMylFile)) 
                        File.Copy(Server.MapPath("~/Content/license/License.l"), 
                            tempMylFile, 
                            true); 
                    _licensefile = tempMylFile; 
                } 
                return _licensefile; 
            } 
        }
        protected void Application_Start()
        {
            Application["LicenseFile"] = LicenseFile;// the global variable's bed

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

在控制器中:

namespace MvcWebApplication.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View(HttpContext.Application["LicenseFile"] as string);
        }

    }
}

这样,我们可以在ASP.NET MVC中使用全局变量:)

注意:如果您的对象不是字符串,只需编写:

return View(HttpContext.Application["X"] as yourType);

2
应该注意的是,您的回答的实质是“使用Application 课堂字典。”
Andrew Barber

@YasserZamani太完美了。但是如何在Controller中修改全局变量?每次更改值时,它都会在其他请求中丢失。
谢德韦

8

您还可以使用静态类,例如Config类或类似的东西...

public static class Config
{
    public static readonly string SomeValue = "blah";
}

0

该钢是远离热,但我结合@ abatishchev与从应答解决方案这篇文章,并得到了这个结果。希望它有用:

public static class GlobalVars
{
    private const string GlobalKey = "AllMyVars";

    static GlobalVars()
    {
        Hashtable table = HttpContext.Current.Application[GlobalKey] as Hashtable;

        if (table == null)
        {
            table = new Hashtable();
            HttpContext.Current.Application[GlobalKey] = table;
        }
    }

    public static Hashtable Vars
    {
        get { return HttpContext.Current.Application[GlobalKey] as Hashtable; }
    }

    public static IEnumerable<SomeClass> SomeCollection
    {
        get { return GetVar("SomeCollection") as IEnumerable<SomeClass>; }
        set { WriteVar("SomeCollection", value); }
    }

    internal static DateTime SomeDate
    {
        get { return (DateTime)GetVar("SomeDate"); }
        set { WriteVar("SomeDate", value); }
    }

    private static object GetVar(string varName)
    {
        if (Vars.ContainsKey(varName))
        {
            return Vars[varName];
        }

        return null;
    }

    private static void WriteVar(string varName, object value)
    {
        if (value == null)
        {
            if (Vars.ContainsKey(varName))
            {
                Vars.Remove(varName);
            }
            return;
        }

        if (Vars[varName] == null)
        {
            Vars.Add(varName, value);
        }
        else
        {
            Vars[varName] = value;
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.