Warum kann ich nicht auf den Seitenstatus in Usercontrol zugreifen?
Ich gespeichert, die ein Objekt in viewstate auf der Seite. Wenn ich jetzt Zugriff auf die gleiche viewsate Objekt usercontrol,es zeigt wie null. Ich habe sogar versucht, um das gleich viewstate mit gleichen Namen in usercontrol und die Seite.Beides hat verschiedene Wert.
Ich verstehen, dass der viewstate ist eine geschützte Eigenschaft. Wie funktioniert diese Sache, die Umsetzung in den oben scenerio oder gibt es irgendeinen anderen Grund für dieses Verhalten.
Edit:
Usercontrol ist es in der markup der Seite. Ich bin nicht geladen, sondern dynamisch.
Ich habe eine Seite EditFacilityworkType.aspx. Auf Seite habe ich ein usercontrol FacilityWorkTypeDetails.aspx(FacilityWorkTypeDetails1). In diesem usercontrol habe ich ein user control Workflow.aspx(Workflow1)
Page_Load() auf der Seite
Ich bin abrufen workflowdetails auf page_load() der Seite.
FacilityWorktype facilityWorkType = facilityDetails.GetFacilityWorktypeDetail(SessionHelper.FacilityWorkTypeID);
ViewState["WorkFlow"] = facilityWorkType.FacilityWorkTypeWorkFlow
Innen usercontrol FacilityWorkTypeDetails.aspx. Ich habe eine Eigenschaft
public FacilityWorktype FacilityWorkTypeDetails
{
get
{
#region Fill FacilityWorktype
return GetEntityFromControl();
#endregion
}
set
{
PopulateControls(value);
}
}
Nun setze ich diese Eigenschaft in die Seite laden der Seite
FacilityWorkTypeDetails1.FacilityWorkTypeDetails = facilityWorkType;
Innen-Workflow.aspx habe ich eine Eigenschaft
///<summary>
///Property to fill entity object from controls on this page
///</summary>
public WorkFlow WorkFlowDetails
{
get
{
return GetEntityFromControls();
}
set
{
BindTranscriptionMethodDDL(ddlTranscMethod);
PopulateControls(value);
}
}
Nun PopulateControls() von FacilityWorkTypeDetails1, ich bin Einstellung der Eigenschaft von workflow1
private void PopulateControls(FacilityWorktype Wert)
{
Workflow1.WorkFlowDetails = value.FacilityWorkTypeWorkFlow;
}
Nun, wenn ich bin, abrufen von Werten von
private WorkFlow GetEntityFromControls()
{
WorkFlow workFlow = (ViewState["WorkFlow"] as WorkFlow) ?? new WorkFlow();
//workFlow is null
}
Nun also innerhalb dieser Funktion workFlow ist null. Ich möchte Fragen,warum ist es null, wenn ich viewstate-in-Seite.
InformationsquelleAutor der Frage Rohit | 2010-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scherand ist sehr korrekt hier. Ich möchte noch hinzufügen, zu dem, was er hat an den Tisch gebracht.
Jedes Steuerelement, das leitet sich aus dem System.Web.UI.Kontrolle hat die ViewState-Eigenschaft. Unter der Haube des Eigentums ist eine StateBag-Sammlung. Jede Instanz eines Steuerelement hat seine eigene StateBag für ViewState, so wie Scherand erwähnt, ViewState ist einzigartig in der Kontrolle. Wenn die Seite gerendert wird, die gesamte Steuerung Struktur der Seite iteriert wird, alle ViewState-Sammlungen zusammengeführt werden, in einen Baum-wie Struktur und das endgültige Struktur serialisiert wird zu einem string und dem Rendern der Seite.
Weil die ViewState-Eigenschaft gekennzeichnet ist geschützt, Sie können sich nicht auf die Seite ViewState aus Ihrem Benutzer-Kontrolle, ohne die Verwendung von reflection.
Aber, in aller Ehrlichkeit, Sie sollten aufgeben, die Verwendung von ViewState als Daten-Speicher-medium. Hier sind einige Gründe, warum:
Es wirklich klingt wie alles, was Sie tun möchten, ist die Freigabe von Daten zwischen Seite und User Controls. Der beste Weg, um Daten zwischen Steuerungen ist es, die "Items" - Auflistung (was ist eine Eigenschaft des HttpContext-Klasse). Die Kollektion ist eine Hashtable und kann von Ihrer Seite zugegriffen werden und die Benutzer-Steuerelemente in etwa so:
Der beste Teil der Verwendung dieser Technik ist, dass es nicht fallen keinerlei zusätzlichen Aufwand oder aufblasen der Seite ausgegeben. Die Items-Auflistung vorhanden ist, die im Kontext einer einzelnen HTTP-Anforderung. Dies bedeutet, dass, wenn Ihr Antrag fertig ist und Ihr die Ausgabe einer Seite gerendert wurde an den client-browser, die Elemente der Auflistung gelöscht wird aus dem server-Speicher. Es ist das ideale medium für temporäre Daten Speicher ASP.NET.
Nun, wenn Sie möchten, dass Ihre Daten-Objekte erreichbar zu bleiben für mehr als nur die aktuelle Anfrage, Sie wären besser dran, die Speicherung der Objekte in der Session.
InformationsquelleAutor der Antwort peanutbutter_lou
Ich immer noch nicht Begriffen hat das alles hier (siehe meine Kommentare oben). Aber ich bin mir ziemlich sicher, dass Sie Missverständnisse
ViewState
.ViewState pro controlnicht pro request oder session oder was auch immer.
In deinem Beispiel, betrachten einige andere Steuerung (z.B. standard-ASP.NET Steuern), die aus irgendeinem Grund beschlossen, etwas mit einem "Namen" von
WorkFlow
in viewstate. Wenn das, was Sie zu tun versuchen würde, dieses Objekt überschrieben würde deine (oder andersrum, würde dir überschrieben werden durch andere).Oder bin ich etwas fehlt?
Vielleicht liest WIRKLICH zu Verstehen, ViewState könnte Ihnen helfen zu verstehen, was viewstate ist/wie es funktioniert (ja, ich mag dieses Artikels, dies ist der Grund, warum ich halten Entsendung, link).
InformationsquelleAutor der Antwort scherand
Postback hast du die Kontrolle? Wenn der code, der hinter noch nicht erstellt die Strg -, dann wird es nicht wissen.
nur Anwendung, wenn dies einer generierten Steuern. Möglicherweise müssen Sie Postleitzahl und weitere Infos zu bekommen eine ordentliche Antwort.
Viewstate ist ein monster das ist, warum viele von uns gehen zu MVC.
InformationsquelleAutor der Antwort griegs
die Seite viewstate ist eine andere statebag aus dem viewstate, dass das usercontrol zugreifen können. jede Steuerung hat Ihren eigenen, privaten Anzeigestatus. So können Sie direkt auf die Seite von einem Benutzersteuerelement viewstate code-behind.
könnte man aussetzen viewstate-Werte mit Eigenschaften oder Methoden, und rufen Sie dann die Eigenschaften/Methoden
InformationsquelleAutor der Antwort marut