¿Cómo declaras las variables globales en ASP.NET MVC?ASP.NET MVC Global Variables
Respuesta
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;
}
}
}
¿Por qué usar la clase de aplicación? El objeto de aplicación se usa para compatibilidad con ASP más antiguo. Además, Microsoft dice: "Esto aumenta el rendimiento porque puede acceder a una variable estática más rápido de lo que puede acceder a un elemento en el diccionario de la aplicación". Fuente: [enlace] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607) –
@wishmesh: De acuerdo. Por otro lado, ¿se guardarán las variables estáticas si la máquina de estado basada en la base de datos está encendida? – abatishchev
Tiene razón. Parece que el "enfoque de variable estática" puede fallar en el jardín web y en otros escenarios. –
puede ponerlos en la Solicitud:
Application["GlobalVar"] = 1234;
Sólo están global dentro de la corriente de IIS/applicition virtual. Esto significa que en una granja web son locales al servidor y dentro del directorio virtual que es la raíz de la aplicación.
También es posible usar una clase estática, como una clase de configuración o algo por el estilo ...
public static class Config
{
public static readonly string SomeValue = "blah";
}
Técnicamente cualquier variable estática o la propiedad de una clase, en cualquier parte de su proyecto, será una variable global, por ejemplo,
public static class MyGlobalVariables
{
public static string MyGlobalString { get; set; }
}
Pero como dice @SLaks, pueden ser 'potencialmente' malas prácticas y peligrosas si no se manejan correctamente. Por ejemplo, en el ejemplo anterior, usted tendría múltiples solicitudes (hilos) tratando de acceder a la misma Propiedad, lo que podría ser un problema si fuera un tipo complejo o una colección, tendría que implementar alguna forma de bloqueo.
Mi voto favorable. De hecho, según Microsoft, esta es una forma preferida de usar variables globales (estáticas) debido al rendimiento. Y el objeto Aplicación se usa para compatibilidad con ASP antiguo. Lea más aquí: [enlace] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607). Tanto AFAIK estática como Application requieren bloqueos si se piensa en seguridad de subprocesos y concurrencia, ya que si la aplicación es segura para subprocesos, los datos a los que está accediendo pueden no serlo. –
Las clases estáticas no son seguras para sesión, es decir. en el mismo momento, 2 solicitudes simultáneas de 2 usuarios compartirán la misma variable, por lo que se estropearán los datos. Para que la sesión del usuario sea segura, creo que debe ser algo como abatishchev mencionado. –
Estoy de acuerdo con @Sunday y creo que esta debería marcar como respuesta correcta; sin embargo, la mejor manera de hacerlo es implementar un patrón de singleton seguro para subprocesos, como: http://csharpindepth.com/Articles/General/Singleton .aspx – Tohid
Para variables no estáticas, que resolvieron todo a través de aplicación de diccionario clase de la siguiente manera:
En 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);
}
}
}
Y en Controlador:
namespace MvcWebApplication.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View(HttpContext.Application["LicenseFile"] as string);
}
}
}
De esta forma podemos tener variables globales en ASP.NET MVC :)
NOTA: Si el objeto no es una cadena escribir simplemente:
return View(HttpContext.Application["X"] as yourType);
Cabe señalar que la esencia de su respuesta es "utilizar el diccionario de la clase' Application'. –
Muchas gracias @AndrewBarber, actualicé mi respuesta! –
@YasserZamani eso es perfecto, pero ¿cómo modificar las variables globales en el controlador? Cada vez que cambié el valor, perdió en otras solicitudes. –
El acero está lejos de calor, pero he combinado @ solución de abatishchev con la respuesta de this post y llegó a este resultado. Esperamos que sea de utilidad:
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;
}
}
}
- 1. ASP.NET MVC Global error handling
- 2. ASP.NET MVC Session vs Global vs Cache
- 3. ASP.NET MVC 2.0 JsonRequestBehavior Configuración global
- 4. Filtro de acción global en ASP.NET MVC
- 5. Pasando variables con POST en ASP.NET MVC
- 6. Python Django Global Variables
- 7. ASP.net MVC - variable global con ámbito de solicitud
- 8. ASP.NET MVC: Ejecutar código en todas las acciones (global OnActionExecuting?)
- 9. ASP.NET MVC 3 e inyección de filtro global
- 10. Global Timer en Asp.net
- 11. MVC SessionStateAttribute no funciona como Global Attribute
- 12. Acceso global frente a variables locales
- 13. Filtros de área global en MVC 3
- 14. MVC Global error handling: Application_Error no dispara
- 15. ASP.NET MVC vs Spring MVC
- 16. Asp.Net MVC y sesión
- 17. asp.net 3.5 ¿Solicitar variables?
- 18. ASP.net MVC estructura del proyecto
- 19. Asp.Net MVC - Sobrecarga método Acción
- 20. ASP.NET MVC vs. ASP.NET 4.0
- 21. ASP.Net MVC vs ASP.Net Formularios
- 22. ASP.NET MVP vs ASP.NET MVC
- 23. ASP.NET MVC Controlador Dependencias (StructureMap)
- 24. Recurso global vs. Recurso local en ASP.NET
- 25. ASP.Net MVC 3.0 Atributo [OutputCache] - ¿Es esto global, o por sesión?
- 26. ASP.net MVC filtro global Autorizar forzando login en una acción AllowAnonymous
- 27. ASP.NET MVC 4 rompe ASP.NET MVC 3 proyectos
- 28. ASP.NET MVC + Backbone.js, ¿tiene sentido esto? ¿ASP.NET MVC realmente necesario?
- 29. ASP.NET MVC Html.Encode - Nuevas líneas
- 30. PHP vs ASP.NET variables estáticas
Su respuesta es - [MVC - ¿Cómo declarar variables globales] (http://stackoverflow.com/questions/4171089/how-to-define-a-global-variable-in- asp-net-web-app) - [Variables globales en ASP.NET MVC] (http://stackoverflow.com/questions/2974542/how-to-declare-a-global-variable-at-an-aspx-page) –
@SLaks Es muy útil cuando se quiere crear un prototipo rápido y sucio para un cliente. Los diseños pobres y las malas prácticas no importan en absoluto cuando se realiza una demostración de UI preventa desechable. – romanoza