ASP.NET / UserControl, ViewState et de perdre les valeurs de Propriété

c'est sur ASP.NET, ViewState, UserControls et de perdre les valeurs de mes propriétés. C'est une question classique en sais, je sais, et même si j'ai cherché ici et sur Google pour trouver une solution à ce problème, je n'ai pas réussi. Au contraire, plus je teste différentes choses, moins je comprends, il me semble.

Sur le dessus de cela, je suis en utilisant ext.net et leur DirectMethod mais je ne pense que cela a beaucoup à voir avec ce problème. Il ya de nombreuses questions que j'ai et j'espère que ce texte sera assez lisible et compréhensible =)

Le Contrôle UserControl

J'ai un UserControl, des Clients.ascx, qui contient certaines Propriétés. Le "plus" important est *_CustomerId*. Le _CustomerId est définie dans le code-behind, dans ext.net's "DirectMethod" comme ceci (code ci-dessous à partir de la Page Clients.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;
        }
    }

La "customer_modify" est l'instance de l'objet UserControl comme défini dans les Clients.aspx (une Page, pas un UserControl):

<asp:Content ID="Content2" ContentPlaceHolderID="CPH_center" runat="server">
    <CP:Customer ID="customer_modify" runat="server" _IsCreateMode="false" ViewStateMode="Enabled" />   
</asp:Content>

Dans cette Page, les Clients.aspx, j'ai ext.net GridPanel que les listes de Clients et quand je clique sur les lignes de la GridPanel l' (Direct)méthode SetCustomer est exécutée.

Comme vous pouvez le voir dans la SetCustomer-méthode, la propriété "_CustomerId" est mis à jour avec un uint, donc permet de jeter un oeil à la Propriété dans le contrôle 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();
        }
    }

Comme vous pouvez le voir, je suis en utilisant le ViewState-thingie et il est mon espoir que l'état, c'est à dire la valeur des biens se serait souvenu. Ils ne le sont pas.

Lorsque je clique sur une Ligne dans la GridPanel la première fois je peux voir (en rupture) que le ViewState["_CustomerId"] == null qui est bien. Je vois par la suite que le setter pour _CustomerId est exécutée et que le ViewState["_CustomerId"] est affecté à la RecordID (uint).

J'ai maintenant cliquez sur une autre Ligne dans le GridPanel et la SetCustomer-la méthode est exécutée à nouveau. Je pause dans l'incubateur pour _CustomerId et de prendre un coup d'oeil à ce que le ViewState["_CustomerId"] est AVANT de l'affecter. C'est 0, mais on peut s'attendre à la valeur de la Rangée précédente cliqué.

Pourquoi est-il 0? Ce qui me manque?

Aussi:

J'ai fait deux de il UserControls sur la Page, l'autre nommé "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>

Ce qui me dérange beaucoup, c'est que chaque fois que je clique sur une Ligne dans la GridPanel le Page_Load dans le contrôle UserControl est exécutée deux fois, même si je ne suis que la mise à jour de l'un d'eux dans la SetCustomer()-méthode.

Pourquoi est-ce?

Des conseils, des idées et de l'aide serait grandement appréciée.

InformationsquelleAutor Ted | 2011-03-29