ASP.NET AJAX UpdatePanel和动态HTML插入问题(Telerik)

好的,我有一个问题。 我目前正在开发一个使用Telerik框架进行ASP.NET AJAX的项目,尽管这并不重要,因为我完全(几乎)绕过Telerik完成这部分工作。

我正在将一个类似Facebook的聊天程序整合到我们公司的CRM系统中,虽然一切都进展到了这一点,但我遇到了障碍。 问题是当我尝试“创建一个新的聊天框”时。 我正在使用asp控件UpdatePanel和jQuery $ .ajax调用将JSON方法名称传递给我的代码隐藏文件。 这是JSON逻辑:

用户列表中的DoubleClick用户:

$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"); } }); }); 

CreateChatBox回调:

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

强制asyncpostback(不应该是必要的,但这甚至不起作用!):

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

UpdatePanel是通过各种文字和一些硬编码的html good-ole’时尚div创建的。 问题在于动态创建所述元素,这很好用。 事实上,如果我把它放在我的PageLoad事件中,我后面的代码(我将在下面发布)创建并显示一切都很好。

无论如何, 这是.aspx:

       

代码背后:

 protected void Panel3_Load(object sender, EventArgs e) { #region Ajax methods if (Request.Form["MethodName"] == "CreateChatBox") { CreateChatBox(); } #endregion Engine m_engine = new Engine(); string 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"].ToString() + "
"; } 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()"); }

我当然忽略了一些非常愚蠢的东西,但来自经验丰富的ASP.Net Ajaxer的一双新鲜眼睛真的很感激! 提前致谢。

澄清问题

什么工作:

  • 代码运行正常。
  • JSON方法传递给后面的代码并读取。
  • CreateChatBox()方法贯穿并据称填充文字和控件。
  • JSON链中的所有回调都成功执行。

什么不起作用:

  • 即使在冗余回发之后,UpdatePanel在代码成功执行后也没有这个新的HTML。

敬启者


好吧,我发布后的第二天就碰巧解决了这个问题。 当然现在有新的障碍需要解决,但我很高兴地说我的异步聊天模块已接近完成。 由于没有人决定接受这个问题,我将发布我所做的事情,以便在ASP.NET中基于硬编码HTML正确生成动态异步对象,因为谷歌搜索此事,这篇文章是唯一相关的结果弹出。

我首先要说的是,我很清楚这是一种非常规的方法。 话虽这么说,项目的要求certificate了手段的合理性。 虽然可能有许多其他方法可以实现您的目标,但这确实有效。 关于我的特定项目,我不打算讨论无关的细节,但希望这将有助于未来的某些人。

错了


我原来问题的主要问题是我攻击渲染序列的方式。 我的逻辑中的一个主要缺陷是试图将ASP控件(文字,占位符,按钮等)与我的HTML分开太多。 我最初的方法(从上面看)如下:

       

最终结果看起来更像是这样的:

    

后面的代码(删节)与此类似:

 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);

这是什么意思


我所做的就是将整个聊天框元素包装在一个占位符中,动态创建HTML元素,从服务器包装所有ASP控件并将其作为动态数据的“块”发布。 这样可以避免使用ASP控件放置的一些奇怪的行为,并允许我的项目的客户端function的准OO方法。 创建之后,我现在可以使用一些JSON和AJAX调用来动态地将数据输入到所述动态创建的控件中。

一个例子是在收到消息时将从数据库通知收到的消息发布到我的聊天窗口(ChatBoxesLiteralMid控件)。

页面/控制加载后

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

为什么要去麻烦?


我所取得的成就是需要远远超出原始范围的特定项目,由另一个开发人员在几年前开始。 这是一种非传统的教导老狗一些新技巧的方法。 我现在几乎可以完全控制客户端上不加区分的实时聊天框/会话数量。 老实说,这真是太棒了。 请随时发布问题(或疑虑),因为我经常检查SO并很乐意回复。