2016-06-28 11 views
0

Ich habe 2 Sitzung für dieselbe Klasse erstellen.Zuweisen einer Sitzung zu einer anderen Sitzung für dieselbe Klasse in C#

public static Breadcrumb Breadcrumb 
    { 
     get { return HttpContext.Current.Session["Breadcrumb"] != null ? (Breadcrumb)HttpContext.Current.Session["Breadcrumb"] : null; } 
     set { HttpContext.Current.Session["Breadcrumb"] = value; } 
    } 

    public static Breadcrumb ChildBreadcrumb 
    { 
     get { return HttpContext.Current.Session["ChildBreadcrumb"] != null ? (Breadcrumb)HttpContext.Current.Session["ChildBreadcrumb"] : null; } 
     set { HttpContext.Current.Session["ChildBreadcrumb"] = value; } 
    } 

und die Klasse für Sitzung verwendet wird, wie unten

[Serializable] 
public class Breadcrumb 
{ 
    public string project { get; set; } 
    public int projectId { get; set; } 
} 

ich nur ein einziges Mal in einem Fall Brotkrumen zu ChildBreadcrumb bin zuweisen.

Aber ChildBreadcrumb aktualisiert die ganze Zeit, wenn Breadcrumb nach Zuweisung geändert wird.

Wie kann ich dieses automatische Update verhindern?

+0

Nur eine Randnotiz - C# hat einen Null-Verkettungsoperator, und Referenztypen können den 'as'-Operator verwenden, so dass Sie nie' x! = Null machen müssen? (T) x: y' - stattdessen 'x ?? y als T' – Keith

Antwort

3

Sitzungen werden erst am Ende des Seitenlebenszyklus serialisiert, in dem sie gespeichert werden. Das bedeutet, dass diese beiden Referenzen bis dahin auf das gleiche Objekt zeigen.

Im Wesentlichen das Sie tun:

var A = new Breadcrumb { project = "original" }; 

var B = A; 

B.project = "change"; 

Als Brotkrumen ist ein class diese sind Referenztypen - sowohl A und B sind Verweise auf die gleiche Breadcrumb

dass eine Kopie Breadcrumb machen zu vermeiden, wenn Sie ordnen es ChildBreadcrumb, etwas wie:

var A = new Breadcrumb { project = "original" }; 

var B = new Breadcrumb { project = A.project, projectId = A.projectId }; 

B.project = "change"; 

Jetzt ist B eine unabhängige Kopie.

Beachten Sie, dass project ist ein unveränderliches string und projectId ist ein Werttyp int, so dass sie nicht die gleiche Art und Weise wie Breadcrumb verhalten.

+0

Vielen Dank Keith für Ihre schnelle Antwort. Mein aktueller Code ist SessionObject.ChildBreadcrumb = SessionObject.Breadcrumb; können Sie diesen Code ändern, um eine Sitzung zu kopieren? –

+0

@NikunjPatel sicher: 'SessionObject.ChildBreadcrumb = neue Breadcrumb {projekt = SessionObject.Breadcrumb.project, projectId = SessionObject.Breadcrumb.projectId};' – Keith

Verwandte Themen