Heute habe ich eine kleine ASP.net Beta-Webanwendung veröffentlicht, die es internen Mitarbeitern erlaubt, einige Produktinformationen zu ändern. Wir begannen damit, auf Probleme zu stoßen, bei denen Benutzer die Produktinformationen ihrer jeweils anderen Seite überschrieben haben ... obwohl jeder Mitarbeiter eine völlig andere Zeile (Produkt) bearbeitet hat.ASP.NET C# Statische Variablen sind global?
Nach einiger Suche auf Google, ich glaube, ich weiß, was los ist, sein mit der Verwendung von statischen Variablen zu tun, ist unten ein schnelles grobes Beispiel für das Problem:
// 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
}
}
also nach Meine Forschung, eine statische Variable existiert tatsächlich für die Anwendung als Ganzes, das heißt, wenn mehrere Benutzer die Anwendung verwenden, werden sie alle den gleichen 'Wert' für '_groupId' lesen und in einigen Fällen sogar auf einen anderen Wert setzen Wert, der bewirkt, dass die Instanz eines anderen Benutzers der Seite Daten in der falschen Zeile speichert (ProductGroupId).
Meine Absicht war, dass die statische Variable von anderen Benutzern isoliert ist und nicht interferieren sollte - jeder Benutzer hat seine eigene Instanz der Seite, also ihre eigene Instanz der Variable '_groupId'.
Zum Glück wurde alles auf einer Dev/Staging-Datenbank statt der Live-db. Ich bin mir nicht sicher, ob ich nur das 'statische' Schlüsselwort ablegen muss, um zu verhindern, dass die Variable von allen gesetzt/gelesen wird.
Irgendwelche Gedanken? Danke
Dank Adam .... die einzige Sache ist, ich brauche es nicht wirklich für andere Seiten zu speichern, ich würde nur den Inhalt von 'Request speichern wollen.QueryString ["GroupID"] 'in eine Variable, die ich überall innerhalb nur dieser Seite verwenden kann ... ohne dass sie von' anderen 'Benutzerinstanzen der Seite geändert wird ... Würde "private _groupId" (das statische Schlüsselwort auslassen) erlauben dafür? Wenn nicht, dann könnte ich Sessions verwenden. Danke für die Eingabe! – Dal
Dal - Sitzungsvariablen werden, wie Sie vermuten, unabhängig von der Seite, die für die gesamte Client-Browsersitzung angezeigt wird, beibehalten (sofern Sie sie nicht manuell ablaufen lassen). Sie können ViewState verwenden, um den Wert zu speichern, jedoch wird er an den Client gestreamt (mit seinen Standardeinstellungen), so dass es eine Chance gibt, mit der er mucked werden könnte (wie unwahrscheinlich). ViewState würde den Wert pro Seite beibehalten. Gibt es einen Grund, warum Sie den QueryString-Wert, den Sie anfangs verwenden, nicht weiter verwenden können? Für Ihre Situation würde ich QueryString, ViewState, HiddenField oder Session zum Speichern empfehlen. –
Danke für die schnelle Antwort. Die Anwendung wurde modifiziert, um den Querystring direkt zu verwenden, anstatt ihn in eine Variable zu schieben, also denke ich, dass ich diese Methode weiterhin verwenden werde (QueryString). Ich war nur neugierig, ob meine ursprüngliche Implementierung immer noch ohne das statische Schlüsselwort funktionieren würde. Danke vielmals! :) – Dal