8
votes

Bug étrange lors de la combinaison d'un ASP.NET UPDOYPANEL AVEC LE JQUERY UI DADYPICKER

J'ai créé une page qui combine une inline JQuery UI DatePicker . Je ne voudrais pas initier un rappel à l'UpdatePanel lorsque l'utilisateur clique sur une nouvelle date pour mettre à jour certaines données. Maintenant, cette page comporte plusieurs étagères de mise à jour (ne demandez pas :)), alors j'ai besoin de vérifier quel UpdatePanel a effectué la recharge afin de faire certaines choses Clientside. J'utilise __ dopostback code> pour faire le post-plan et sys.webforms.pagerequestmanager.getinstance (). Add_endreQuest (fonction (expéditeur, args) {} code> Pour écouter quand une mise à jour est terminé.

Le problème est que, dans FF, le rappel me dit que ce n'est pas une opération ASYNC, et que les données que je dois avoir à vérifier quelle updatepanel a effectué la mise à jour sur NULL. P>

My problème est que cela fonctionne correctement dans IE, mais pas dans aucun autre navigateur, qui pourrait être causé par 2 choses: c'est-à-dire entre un quirksmode qui résout la question (c'est ce que je pense) ou que c'est-à-dire qu'il a une sorte de support natif pour L'UpdatePanel que d'autres navigateurs ne font pas. P>

J'ai réduit le problème et produisait un test de test: P>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js "></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js "></script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />

    <script type="text/javascript">
        function doAspNetPostback() {
            __doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', '');
        }

        $(document).ready(function() {
            /* Create the datepicker */
            buildDatepicker();
            /* Add callback-method for when the scriptmanager finished a request */
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {
                /* Show the panelID - This is 'upd1|hiddenOnSelectionChangedButton' in IE as it should be, and null in Chrome / FF */
                alert(sender._postBackSettings.panelID);
            });
        });

        function buildDatepicker() {
            var dp = $("#datepicker").datepicker({
                onSelect: function(dateText, inst) {
                    /* Do a postback when someone clicks a date */
                    doAspNetPostback();
                }
            });
        }        
    </script>

    <div id="datepicker">
    </div>
    <asp:UpdatePanel UpdateMode="Conditional" ID="upd1" runat="server">
        <ContentTemplate>
            <asp:Button ID="hiddenOnSelectionChangedButton" Text="Press me" runat="server" />
            <div id="lala" runat="server">
                Upd1
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
    </form>
</body>
</html>


0 commentaires

10 Réponses :


0
votes

Un problème commun avec les combinaisons d'Ajax et de JQuery est que cela ...

$(document).ready(function() {
       buildDatepicker(document);
...

function buildDatepicker(element) {
    var dp = $("#datepicker", element).datepicker({
        onSelect: function(dateText, inst) {
            /* Do a postback when someone clicks a date */
            doAspNetPostback();
        }
    });
}    


1 commentaires

Eh bien, la datePicker est déjà en dehors du contenu du contenu de l'UpdatePanel, il ne devrait donc pas être affecté. J'ai essayé votre solution, mais cela montre toujours NULL dans Firefox :(



0
votes

Vous pouvez essayer d'utiliser DatePicker pour définir un altfield et vérifier que des modifications apportées à un publication.


1 commentaires

Oui, on dirait que c'est la seule façon d'aller :(



0
votes

J'ai essayé votre code pour reproduire l'erreur et je peux reproduire l'erreur. Et je suis arrivé à la conclusion qu'il y a un problème avec JQuery / UpdatePanels.

Si je remplace le bouton avec un linkbutton, vous pouvez voir que le lien appelle directement __dopostback (...), la même fonction exacte avec les mêmes arguments que vous appelez. Et cliquez sur le bouton de liaison qui fonctionne directement, mais en cliquant sur une date, ça ne marche pas.

Cela signifie que quelque chose se passe à l'intérieur de JQuery qui change du contexte. Mais je n'ai aucune idée de ce que ce serait.


0 commentaires

0
votes

J'ai trouvé un autre script un certain temps que j'utilise depuis un moment et que je n'ai jamais eu de problèmes. xxx

Vous pouvez toujours définir manuellement une fonction de rappel exactement comme si vous le faites dans votre script ci-dessus.

Vous devrez également ajouter manuellement un gestionnaire de scriptresource (impossible de souvenir Lequel) mais je me souviens spécifiquement de poser des problèmes d'appel à l'async et aux posts non asynchrones. Espère que cela aide.


0 commentaires

1
votes

J'ai corrigé divers problèmes asynchronisés avec jQuery / updatePanels à l'aide de l'argument ScriptMode = "Libération" sur le scriptManager.

  <asp:ScriptManager ID="scriptManager" runat="server" ScriptMode="Release">
  </asp:ScriptManager>


0 commentaires

0
votes

ressemble à une condition de course, essayez updateemode = "conditionnel" et enfantsastriggers = "false", référence .


1 commentaires

N'a pas aidé, bien que je suis d'accord, cela ressemble à une condition de course :)



0
votes

Cependant, si je passe à travers le code dans Firebug assez lentement, ça marche

Oh? Pourquoi ne pas lui donner une seconde pour le calculer? xxx


1 commentaires

Hehe .. Ouais, essayé ça, mais ce n'est pas vraiment le genre de solution que je recherche XD



4
votes

Je pense que je trouve mon article de MSDN intéressant: http: // msdn.microsoft.com/en-us/magazine/cc163413.cexaspx

L'article dit que "sys.webforms.pagerequestmanager.getinstance (). add_pageloaded strong> (" attache également à UpdatePanel Evénements complets. P>

Il tire également chaque fois un Callback asynchrone lancé sur Behalf d'un contrôle UpdatePanel complète et le contenu à l'intérieur UpdatePanel est mis à jour. P> blockQquote>

Dans votre gestionnaire, vous pouvez faire boucle via les étagères mis à jour avec P>

var panels = args.get_panelsUpdated();
for (i=0; i < panels.length; i++) { alert(panels[i]); }


0 commentaires

0
votes

J'ai aimé la réponse de Tim, entourant l'idée que vous devriez utiliser arg.get_panelSupdated () dans l'événement pageloaded. Cela semble être le moyen approprié de faire ce que vous essayez de faire. Essayez-le - si cela ne fonctionne pas, j'ai une autre idée de ma manche (bien que son genre de sale).


0 commentaires

0
votes

Je pensais que c'était intéressant, si vous ajoutez une alerte après que le dopostback, FF ne renvoie pas NULL.

    function doAspNetPostback() {

        __doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', '');
        alert('<%= hiddenOnSelectionChangedButton.ClientID %>');
    }


0 commentaires