ASP.NET MVC全局variables
你如何在ASP.NET MVC中声明全局variables?
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; } } }
从技术上讲,你的项目中的任何一个类的任何静态variables或属性将是一个全局variables,例如
public static class MyGlobalVariables { public static string MyGlobalString { get; set; } }
但正如@SLaks所说,如果处理不当,他们可能会“不好”的做法和危险。 例如,在上面的例子中,你会有多个请求(线程)试图访问相同的属性,这可能是一个问题,如果它是一个复杂的types或集合,你将不得不实现某种forms的locking。
你可以把它们放在应用程序中:
Application["GlobalVar"] = 1234;
在目前的IIS /虚拟应用程序中,它们只是全局的。 这意味着,在一个webfarm上它们是服务器本地的,并且在作为应用程序根目录的虚拟目录中。
对于非静态variables,我通过Application类字典对它进行了sorting,如下所示:
在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中拥有全局variables:)
注意:如果你的对象不是string,只需写:
return View(HttpContext.Application["X"] as yourType);
你也可以使用一个静态类,比如一个Config类或类似的东西…
public static class Config { public static readonly string SomeValue = "blah"; }
钢铁是远远不热,但我结合@ abatishchev的解决scheme与这个职位的答案,并得到了这个结果。 希望它是有用的:
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; } } }
- 使用InstallUtil并以静默方式设置Windows服务login用户名/密码
- 如何初始化一个List <T>到一个给定的大小(而不是容量)?
- 在C#中,我应该使用string.Empty或String.Empty或“”intitialize一个string?
- 在一个范围内使用C#生成一个随机数
- 在ASP.NET RegularExpressionValidator中使正则expression式不区分大小写
- Visual Studio 2012可以与Visual Studio 2010并排安装吗?
- 如何使用.NET在目录中find最近的文件,并且没有循环?
- 如何使String.Contains不区分大小写?
- 在运行时dynamic生成DLL程序集