Hoy lancé una pequeña aplicación web asp.net beta que permite al personal interno modificar cierta información del producto. Empezamos a tener problemas en los que los usuarios sobrescribían la información de los demás productos ... aunque cada miembro del personal estaba editando una fila totalmente diferente (Producto).ASP.NET C# Las variables estáticas son globales?
Después de algunas búsquedas en Google, creo que sé lo que está pasando, es que ver con el uso de variables estáticas, a continuación es un ejemplo aproximado rápida del problema:
// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{
private static int _groupId = 0;
protected void Page_Load(object sender, EventArgs e)
{
_groupId = Convert.ToInt16(Request.QueryString["GroupID"]);
// get existing ProductGroup information from database using
//_groupId to find the row and populate textboxes
}
private void saveProductGroupData()
{
// when user hits 'save changes' button, update row
//where the primary key column 'ProductGroupID' matches _groupId in the table
}
}
Así, de acuerdo con mi investigación, una variable estática realmente existe para la aplicación como un todo, eso significa que si varios usuarios están usando la aplicación, todos estarán leyendo el mismo 'valor' para '_groupId' y en algunos casos realmente estableciéndolo en una diferente valor que causa que la "instancia" de otro usuario de la página guarde los datos en la fila incorrecta (ProductGroupId).
Mi intención era que la variable estática esté aislada de otros usuarios, y no debería interferir: cada usuario tiene su propia instancia de la página y, por lo tanto, su propia instancia de la variable '_groupId'.
Afortunadamente, todo estaba teniendo lugar en una base de datos de desarrollo/configuración, no en la base de datos en vivo. No estoy seguro de si solo necesito dejar la palabra clave "estática" para evitar que la variable sea establecida/leída por todos.
¿Alguna idea? Gracias
Gracias Adam ... lo único es que realmente no necesito almacenar esto para utilizarlo en otras páginas, solo quería almacenar el contenido de 'Solicitud'.QueryString ["GroupID"] 'en una variable que puedo usar en cualquier lugar dentro de esa página ... sin que sea modificada por' otras 'instancias del usuario de la página ... ¿Podría "private _groupId" (omitir la palabra clave estática) permitir ¿para esto? Si no, entonces creo que podría usar Sesiones. ¡Gracias por el aporte! – Dal
Dal: las variables de sesión, como sospecha, se guardan independientemente de la página que se está viendo para la totalidad de la sesión del navegador del cliente (a menos que las expire manualmente). Puede usar ViewState para almacenar el valor, sin embargo, se transmite al cliente (con su configuración predeterminada), por lo que existe la posibilidad de que se lo pueda robar (aunque sea poco probable). ViewState mantendría el valor en una base por página. ¿Hay alguna razón por la que no pueda continuar utilizando el valor de QueryString que está utilizando inicialmente? Para su situación, recomendaría QueryString, ViewState, HiddenField o Session para el almacenamiento. –
Gracias por la respuesta rápida. La aplicación se ha modificado para usar la cadena de consulta directamente en lugar de insertarla en una variable, así que sí, creo que continuaré usando este método (QueryString). Tenía curiosidad de saber si mi implementación original todavía funcionaría sin la palabra clave estática. ¡Muchas gracias! :) – Dal