ASP.NET / Benutzersteuerelement ViewState und verlieren die Eigenschaft Werte
dies ist über ASP.NET ViewState, Benutzersteuerelemente und verlieren die Werte von meinen Eigenschaften. Es ist eine klassische Frage, die durch weiß, ich weiß, und obwohl ich habe gesucht hier und bei Google nach einer Lösung für dieses problem, ich habe nicht gelungen. Im Gegenteil, je mehr ich Teste verschiedene Dinge, die weniger verstehe ich, wie es scheint.
Oben auf der ich bin mit ext.net und Ihre sogenannte DirectMethod ist, aber ich denke, dass hat viel zu tun mit diesem problem. Es gibt zahlreiche Fragen, die ich habe und ich hoffe, dass dieser text wird gut lesbar und verständlich =)
Die UserControl -
Ich habe ein UserControl, Kunden.ascx enthält einige Eigenschaften. Die "meisten" wichtig ist *_CustomerId*. Die _CustomerId ist im code-behind, in ext.net's "DirectMethod" wie folgt aus (code unten aus der Seite der Kunden.aspx):
[DirectMethod]
public void SetCustomer()
{
RowSelectionModel sm = GridPanel2.SelectionModel.Primary as RowSelectionModel;
if (sm.SelectedRow != null)
{
uint customerId = uint.Parse(sm.SelectedRow.RecordID);
customer_modify._CustomerId = customerId;
}
}
"Customer_modify" ist die Instanz des UserControl im Sinne der Kunden.aspx (eine Seite, nicht ein UserControl):
<asp:Content ID="Content2" ContentPlaceHolderID="CPH_center" runat="server">
<CP:Customer ID="customer_modify" runat="server" _IsCreateMode="false" ViewStateMode="Enabled" />
</asp:Content>
In dieser Seite, die Kunden.aspx, ich habe ext.net GridPanel, dass die Listen der Kunden und wenn ich auf die Zeilen in der GridPanel die (Direkte Methode)SetCustomer ausgeführt wird.
Wie Sie sehen können, in der SetCustomer-Methode, die Eigenschaft "_CustomerId" wird aktualisiert und mit einem "uint", also werfen wir einen Blick auf die Eigenschaft in der UserControl:
public uint _CustomerId
{
get
{
object o = ViewState["_CustomerId"];
if (o == null)
return 0;
return (uint)o;
}
set
{
object o = ViewState["_CustomerId"];
ViewState["_CustomerId"] = value;
SetCustomer();
}
}
Wie Sie sehen können, ich bin mit dem ViewState-thingie, und es war meine Hoffnung, dass der Staat, dh der Wert der Eigenschaften erinnern würde. Sie sind es nicht.
Wenn ich auf eine Zeile in der GridPanel das erste mal ich sehen kann (von Bruch), dass der ViewState["_CustomerId"] == null, das ist in Ordnung. Ich sehe danach, dass die Set-für _CustomerId ausgeführt wird und dass der ViewState["_CustomerId"] zugeordnet, die Datensatz-id (uint).
Ich jetzt auf eine andere Zeile in der GridPanel und die SetCustomer-Methode erneut ausgeführt wird. Ich breche in den setter für _CustomerId und werfen Sie einen Blick auf das, was der ViewState["_CustomerId"] ist VOR der Zuweisung. Es 0 ist, aber ich erwarte, dass er den Wert aus der vorherigen Zeile geklickt.
Warum ist es 0? Was bin ich?
Auch:
Eigentlich habe ich zwei von dort Benutzersteuerelemente auf der Seite, die andere mit dem Namen "customer_create":
<ext:Window
ID="Window_CreateNewCustomer"
runat="server"
Icon="New"
Title="Skapa ny kund"
Hidden="true"
Width="480"
Height="370"
Modal="true">
<Content>
<CP:Customer ID="customer_create" runat="server" Title="Skapa ny kund" _IsCreateMode="true" />
</Content>
</ext:Window>
Was stört mich eine Menge, ist, dass jeder und jedes mal, wenn ich auf eine Zeile in der GridPanel die Page_Load-in der UserControl - zweimal ausgeführt, auch wenn ich nur die Aktualisierung einer von Ihnen in der SetCustomer()-Methode.
Warum ist das so?
Irgendwelche Tipps, Ideen und Hilfe würde sehr geschätzt werden.
InformationsquelleAutor Ted | 2011-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
ViewState
serialisiert, enciphered und an den client gesendet als hidden-form-Feld, so dass es möglicherweise wieder hergestellt werden, wenn etwas löst eine form der Unterwerfung. Ein[DirectMethod]
geht nicht durch die form der Einreichung (es ist verarbeitet wie ein AJAX-call), so kann weder Lesen noch schreibenViewState
Daten, es sei denn, das " round-tripping dieser Daten explizit angefordert mitViewStateMode.Enabled
.Auf eine bestimmte Anforderung zu einem Formular weitergeleitet, die
Load
Ereignis wird ausgelöst von der Seite, und damit durch jeden Benutzer-Steuerelement auf die Seite, abonniert die Veranstaltung in der erwarteten phase des Seite Verarbeitung lifecycle - ob es zwei Instanzen einerUserControl
oder zwei verschiedeneUserControl
s, es sind zwei Abonnenten und daher zwei Aufrufe (eine für jede Instanz).Die Sache mit dem Page_Load-Ausführung doppelt, obwohl Im nur die Aktualisierung eines UserControl... Kannst du ein paar Worte zu sagen? =)
Ich werde nur hinzufügen, eine kurze Bemerkung zu bestätigen, aber ja... standardmäßig ViewState wird nicht gesendet in einer DirectMethod oder DirectEvent Anfrage in Ext.NET. Als Sie entdeckt, können Sie überschreiben diese Funktionalität durch die Einstellung ViewStateMode=Aktiviert.
Vielen Dank für diese Antwort, ich war Suche jeder, wo ! und funktionierte gut für mich !
InformationsquelleAutor Jeffrey Hantin