ASP.NET AJAX UpdatePanel & Problème d’insertion HTML dynamic (Telerik)

Ok donc j’ai un problème. Je travaille actuellement sur un projet utilisant le framework Telerik pour ASP.NET AJAX, bien que cela ne devrait pas compter autant que je contourne (presque) complètement Telerik pour cette partie du travail.

Je suis en train de créer un programme de chat similaire à celui de Facebook dans le système de gestion de la relation client de notre entreprise et, bien que tout se soit bien déroulé jusqu’à présent, j’ai rencontré un obstacle. Le problème est lorsque j’essaie de “créer une nouvelle boîte de discussion”. J’utilise le contrôle asp UpdatePanel avec un appel jQuery $ .ajax pour transmettre un nom de méthode JSON à mon code derrière le fichier. Voici la logique JSON:

DoubleClick sur l’utilisateur dans la liste d’utilisateurs:

$telerik.$(".UserListEntry").dblclick(function () { var ToName = $telerik.$(this).children(".UserListEntryName").text(); var FromName = $telerik.$("#lkUserGeneralSettings").text(); $telerik.$.ajax({ type: 'POST', url: 'DefaultHandler.ashx', data: { "ToName": ToName, "FromName": FromName }, success: CreateChatBox(), error: function (response) { alert("error: 001"); } }); }); 

Rappel de CreateChatBox:

 function CreateChatBox() { $telerik.$.ajax({ type: 'POST', url: 'Default.aspx', data: { MethodName: "CreateChatBox" }, success: ForceAsyncPostback, error: function (response) { alert("error: 002"); } }); } 

Force asyncpostback (ne devrait pas être nécessaire, mais cela ne fonctionne même pas non plus!):

 function ForceAsyncPostback() { var UpdatePanel1 = ''; if (UpdatePanel1 != null) { __doPostBack(UpdatePanel1, ''); } alert("Success"); } 

UpdatePanel est créé par le biais de divers littéraux et de divs codés au format HTML codés en dur. Le problème n’est PAS lié à la création dynamic desdits éléments, cela fonctionne parfaitement. En fait, mon code behind (que je vais publier ci-dessous) crée et affiche tout parfaitement si je le place dans mon événement PageLoad.

En tout cas, voici le .aspx:

       

Code Derrière:

 protected void Panel3_Load(object sender, EventArgs e) { #region Ajax methods if (Request.Form["MethodName"] == "CreateChatBox") { CreateChatBox(); } #endregion Engine m_engine = new Engine(); ssortingng m_sql = @"SELECT FullName FROM Users WHERE RecordDeleted  1"; DataTable dt = m_engine.GetObjectsAsDataTable(m_sql); for (int i = 0; i < dt.Rows.Count; i++) { UserListViewLiteral.Text += "
 " + dt.Rows[i]["FullName"].ToSsortingng() + "
"; } RadAjaxManager.GetCurrent(Page).ResponseScripts.Add("ChatAjax()"); } private void CreateChatBox() { ChatBoxesLiteralTop.Text = @"
John Doe
"; TextBox txt = new TextBox(); txt.ID = "ChatBoxMessageInput"; txt.Height = 16; txt.MaxLength = 270; txt.Width = 250; txt.AutoPostBack = false; ChatBoxesPlaceHolder.Controls.Add(txt); RadButton btn = new RadButton(); btn.ID = "ChatBoxSendButton"; btn.Text = "Send"; btn.AutoPostBack = true; btn.Height = 22; btn.Click += ChatBoxSendButton_Click; ChatBoxesPlaceHolder.Controls.Add(btn); ChatBoxesLiteralBot.Text = "
"; Panel3.Update(); RadAjaxManager.GetCurrent(Page).ResponseScripts.Add("ChatAjax()"); }

J’oublie certes quelque chose d’une stupidité scandaleuse, mais les yeux d’un ASP.Net Ajaxer chevronné seraient vraiment appréciés! Merci d’avance.

Clarification de la question

Qu’est-ce qui fonctionne:

  • Le code fonctionne correctement.
  • La méthode JSON est transmise au code situé derrière et lue.
  • La méthode CreateChatBox () s’exécute et remplit prétendument les littéraux et les contrôles.
  • Tous les rappels de la chaîne JSON sont exécutés avec succès.

Qu’est-ce qui ne marche pas:

  • UpdatePanel, même après la publication redondante, n’a pas ce nouveau code HTML après l’exécution du code.

À qui cela concerne


Eh bien, il m’est arrivé de résoudre ce problème le lendemain de sa publication. Bien sûr, il y a maintenant de nouveaux obstacles à surmonter, mais je suis heureux de dire que mon module de discussion asynchrone est presque terminé. Puisque personne n’a décidé de s’attaquer au problème, je vais publier ce que j’ai fait pour produire correctement des objects dynamics et asynchrones basés sur du code HTML codé en dur dans ASP.NET. En effet, pendant la recherche sur Google, cet article était le seul résultat pertinent à apparaître. .

Je commencerai par dire que je suis bien conscient que cette approche est très peu conventionnelle. Cela dit, les exigences du projet justifiaient les moyens. Bien qu’il puisse y avoir de nombreuses autres façons d’atteindre votre objective, cela fonctionne. Je ne vais pas entrer dans des détails superflus en ce qui concerne mon projet en particulier, mais j’espère que cela aidera quelqu’un à l’avenir.

Les torts


Le problème principal de ma question initiale était la façon dont je m’attaquais à la séquence de rendu. Un défaut majeur de ma logique consistait à séparer trop les contrôles ASP (littéraux, espaces réservés, boutons, etc.) de mon code HTML. Mon approche initiale (vue du dessus) était la suivante:

       

Le résultat final ressemble plus à ceci:

    

Avec le code derrière (abrégé) semblable à ceci:

 Literal top = new Literal(); // ... UpdatePanel UpdatePanel2 = new UpdatePanel(); // ... top.Text = @"
" + UserNames[0] + @"
"; top.ID = "ChatBoxesLiteralTop"; top.Mode = LiteralMode.PassThrough; // ... UpdatePanel2.ID = "UpdatePanel2"; UpdatePanel2.UpdateMode = UpdatePanelUpdateMode.Conditional; UpdatePanel2.ChildrenAsTriggers = false; UpdatePanel2.ContentTemplateContainer.Controls.Add(top2); // ... Panel3.ContentTemplateContainer.Controls.Add(top); Panel3.ContentTemplateContainer.Controls.Add(UpdatePanel2); Panel3.ContentTemplateContainer.Controls.Add(mid);

Ce que cela veut dire


Tout ce que j’ai fait est d’intégrer l’intégralité de mes éléments de chatbox dans un espace réservé unique, en créant dynamicment des éléments HTML qui enveloppent tous les contrôles ASP du serveur et en les publiant comme un “bloc” de données dynamics. Cela évite sinon certains comportements étranges avec le placement de contrôle ASP et permet une approche quasi-OO pour la fonctionnalité côté client de mon projet. Après la création, je peux maintenant utiliser certains appels JSON et AJAX pour entrer de manière dynamic des données dans les contrôles créés de manière dynamic.

Un exemple serait de publier un message reçu d’une notification de firebase database dans ma fenêtre de discussion (contrôle ChatBoxesLiteralMid) lors de sa réception.

Après la charge de page / contrôle

 if(ChatBoxesLiteralMid != null) ChatBoxesLiteralMid.Text += @"
" + AppParameters.Current.AppUser.FirstName + "" + dy.Rows[dy.Rows.Count - 1]["Message"].ToSsortingng() + "
";

Pourquoi aller au problème?


Ce que j’ai accompli, c’est pour un projet particulier qui doit aller bien au-delà de la scope initiale, lancée par un autre développeur des années auparavant. C’est une façon peu conventionnelle d’enseigner de nouvelles astuces au vieux chien. Je contrôle maintenant presque totalement un nombre indéterminé de boîtes / sessions de discussion en temps réel du côté du CLIENT. C’est vraiment très gentil, gentiment, honnêtement. N’hésitez pas à poster des questions (ou des préoccupations) car je vérifie régulièrement SO et suis heureux de répondre.