IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Incompréhension au niveau du viewstate : HiddenField, Javascript et ModalPopupExtender


Sujet :

ASP.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Incompréhension au niveau du viewstate : HiddenField, Javascript et ModalPopupExtender
    Bonjour,

    Je pense que j’ai un souci de compréhension du cycle de mes pages et je serai heureux de comprendre ce que je manque et d’en apprendre encore un peu plus sur cette notion essentielle.
    Voici le contexte et mon souci : nous travaillons sur une application Web en vb.net dans laquelle la plupart des écrans sont des contrôles utilisateurs chargés dans une masterpage.
    Dans l’uc me posant un problème j’ai un modalpopupexetender ouvrant un panel sur le click d’un bouton. Jusque-là rien d’inquiétant.

    Dans ce panel se trouve une GridView dont le click sur une ligne déclenche la fermeture de la modalPopup et un script javascipt qui enregistre la clé de la ligne cliquée dans un Hiddenfield et ouvre une autre popup (aspx cette fois) qui elle déclenche à sa fermeture un postback de la page initiale.

    Mon problème est de récupérer la clé de la ligne de la gridview qui a été cliquée, dans le code Behind, lors de ce dernier postback et là je coince !
    Lors de l’exécution du javascript, le hiddenfield est bien rempli, mais une fois dans le code behind, il n’y a plus rien dedans.
    Remarque : Suite à plusieurs recherche sur le net, j’ai tenté d’utiliser un textbox en « display :none », après avoir lu qu’ils n’avaient pas le même comportement vis-à-vis des modifications effectuées du côté client, mais le résultat est identique.

    En espérant avoir été assez précis et compréhensible pour obtenir votre aide, voici quelques extraits de mon code :

    Dans l’ascx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <AjaxToolkit:ModalPopupExtender runat="server" ID="mpeLiaisonSalle" PopupControlID="pnlLiaisonSalle" TargetControlID="lnkbtnLiaisonSalle"
        CancelControlID="lnkbtnRetourLiaisonSalle" BackgroundCssClass="modal_background" />
     
    <asp:HiddenField ID="hfSalleALier" runat="server" EnableViewState="true" />
    Dans l’ascx.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ‘Ajout du javascript permettant d’enregistrer la clé de la ligne cliquée de la gridview dans le HiddenField  « hfSalleALier »
    Protected Sub gvListeSalles_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvListeSalles.RowDataBound
            If (e.Row.RowType = DataControlRowType.DataRow) Then
                e.Row.Attributes.Add("onclick", String.Format("javascript:document.getElementById('{0}').Value = {1};", hfSalleALier.ClientID, CType(e.Row.DataItem, DayPilot.Web.Ui.Resource).Value))
            End If
        End Sub
     
    ‘Gestion de l’évènement click du bouton ouvrant la modalPopup
    Private Sub ibtnAjouterMateriel_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs) Handles ibtnAjouterMateriel.Click
            Dim script As String = String.Empty
            script &= "popupPageRechercheRessource(800, 600, 'RechercheRessources', '" & hfNouvelleRessource.ClientID & "', '', '" & lnkValiderAjoutRessource.UniqueID & "',0,'','" & Ressource.ETypeRessource.Materiel & "'); return false; "
     
            mpeLiaisonSalle.OnOkScript = script
            mpeLiaisonSalle.OkControlID = "gvListeSalles"
     
            ChargerListeSalles()
            pnlLiaisonSalle.Visible = True
            mpeLiaisonSalle.Show()
        End Sub
    D'avance merci de vos commentaires et de votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 75
    Points
    75
    Par défaut viewstate
    Salut,

    Premièrement la viewstate dans une datagrid c'est déconseille car plus ta datagrid est grande plus la page est lourde à charger en fait la viewsate c'est un input=hidden qui garde l'état de chaque controle donc imagine :
    Chaque contrôle est chargé de stocker son propre état, ce qui est accompli en ajoutant son état ​​modifié à sa ViewState propriété. Le ViewState propriété est définie dans la System.Web.UI.Control classe, ce qui signifie que tous les contrôles serveur ASP.NET ont cette propriété disponible.
    bref la viewstate va durer pendant que la page dure .

    pour ce cas la je pense qu'il y a beaucoup de postback et je crois qu'il y a un chargement complet de la page à cause de ModalPopupExtender(je fais des cauchemars à cause ModalPopupExtender ) ,donc je te dirais de mettre la valeur de hiddenfield que t'a rempli directement dans une variable de session et après bien quand t'auras ta donnée tu la supprime.

    j’espère que ça va t'aider.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    petite précision suite à la remarque de Safi_heram : la gridview n'est pas dans le viewstate et il n'y a aucun postback entre l'ouverture de la modalpopup et le postback provoqué à la fermeture de ma 2ème popup.

    Ce que je ne comprends vraiment pas, c'est que mon hiddenfield ne soit pas conservé lors du postback qui suit sa modification par le javascript.

    @Safi_heram : merci de ta réponse et pour ta proposition, mais tant que possible je souhaiterai éviter de passer par une variable de session.
    D'ailleurs, je ne vois pas bien comment remplir une variable de session (côté serveur) depuis du javascript (côté client) ???

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par bozood Voir le message
    D'ailleurs, je ne vois pas bien comment remplir une variable de session (côté serveur) depuis du javascript (côté client) ???
    je ne suis pas sur mais si il y a un rechargement de toute la page surtout qu'un modalpopupextender affiche tu dis toute une page aspx ,donc je pense que la viewstate de ton hiddenfield est vidée,puis tu dis que ton hiddenfield se rempli donc là tu peux faire ça '<%Session("MyTest")=tonhiddenfieal.value%>';(ce n'est pas conseillé):,et avant d'utiliser ça regarde l’évènement unload de la page et vérifie ton hiddenfield .

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Il semble que je n'ai pas réussi à être vraiment clair, donc voici encore quelques précisions :
    Je n'ouvre pas une page aspx dans une modal, mais juste un panel avec simplement une gridview:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <asp:LinkButton ID="lnkbtnLiaisonSalle" runat="server" Style="display: none" />
     
    <asp:Panel runat="server" ID="pnlLiaisonSalle" Style="width:300px; background-color:#FFF; border:solid 1px #ADCDD6; border-top:0;" >
        <div class="entetePopin" style="position:relative;">
                <span class="formulaires" style="padding-left:5px;">Liaison à une salle</span>
                <asp:ImageButton runat="server" ID="imgbtnFermerLiaisonSalle" ImageUrl="~/ressources/icones/Petites/ico_p_retour.gif" Style="position: absolute; right: 50px;
                top: 8px;" />
                <asp:LinkButton runat="server" ID="lnkbtnRetourLiaisonSalle" CssClass="formulaires" Text="Retour" Style="position: absolute; right: 8px; top: 0px;" />
        </div>
        <div style="margin-top:10px;">
            <asp:GridView ID="gvListeSalles" runat="server" AutoGenerateColumns="False" BorderStyle="Solid" 
                BorderWidth="1px" CssClass="tabcadre" GridLines="None" ShowFooter="False" Width="100%" DataKeyNames="Value">    
        <RowStyle CssClass="txtTab +tabFondLigneAlterne" Height="22px" />
     
        <Columns>
            <asp:TemplateField Visible="false" >
                <ItemTemplate>
                   <asp:label ID="lblNumeroSalle"  runat="server" Text='<%# eval("Value") %>' />
                </ItemTemplate>
                <HeaderStyle HorizontalAlign= "Center" />
                <ItemStyle CssClass="formulaires" HorizontalAlign="Left" Width="5%" Wrap="False" />
            </asp:TemplateField>
            <asp:TemplateField  HeaderText="Salle/Batiment" >
             <ItemTemplate>
                <asp:LinkButton ID="lnkBtnNomSalle" runat="server" Text='<%# eval("Name") %>' />
                 </ItemTemplate>
                <FooterStyle HorizontalAlign="Left" />
                <HeaderStyle HorizontalAlign="Left" />
                <ItemStyle CssClass="formulaires" HorizontalAlign="Left" VerticalAlign="Top" Wrap="False" />
            </asp:TemplateField>
         </Columns>
        <HeaderStyle CssClass="txtTab + tabFondLigne " Height="25px" />
        <EditRowStyle CssClass="formulaires + tabFondLigne " />
        <AlternatingRowStyle CssClass="txtTab + tabFondLigne " />
        <SelectedRowStyle CssClass="formulaires + tabFondLigne " />
    </asp:GridView>
     </div>
     </asp:Panel>
     
    <AjaxToolkit:ModalPopupExtender runat="server" ID="mpeLiaisonSalle" PopupControlID="pnlLiaisonSalle" TargetControlID="lnkbtnLiaisonSalle"
        CancelControlID="lnkbtnRetourLiaisonSalle" BackgroundCssClass="modal_background" />
    Puis ensuite une page aspx en popup, plus classique (~window.open), sans repasser par le code behind:
    Je confirme, à nouveau, qu'il n'y a bien aucun rechargement/aucun postback de la page initiale entre l'ouverture de la modal Popup et le postback généré par la fermeture de la 2ème popup.

    Est-ce que quelqu'un peut m'expliquer pourquoi dans ce contexte l'hiddenField renseigné avant l'ouverture de la 2ème popup est vide lors du postback suivant ?

Discussions similaires

  1. Lecture vidéo : monter un niveau de son avec javascript ?
    Par Mister Paul dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/11/2010, 16h34
  2. Incompréhension au niveau de la vue
    Par mattdef dans le forum MVC
    Réponses: 0
    Dernier message: 19/11/2009, 20h13
  3. [MySQL] Incompréhension au niveau des récupérations de données
    Par kenny49 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/04/2007, 18h19
  4. Erreur javascript incompréhensible
    Par guidav dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/01/2007, 10h12
  5. erreur javascript incompréhensible
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/08/2005, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo