わかりました。問題があります。私は現在、ASP.NET AJAX用のTelerikフレームワークを使用してプロジェクトに取り組んでいますが、作業のこの部分では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 = '<%=Panel3.ClientID%>';
if (UpdatePanel1 != null) {
__doPostBack(UpdatePanel1, '');
}
alert("Success");
}
UpdatePanelは、さまざまなリテラルとハードコードされたhtmlgood-ole'形式のdivを使用して作成されます。問題は、前述の要素の動的な作成ではなく、これは問題なく機能します。実際、私のコードビハインド(以下に投稿します)は、PageLoadイベントに配置すると、すべてを完全に正常に作成して表示します。
とにかく、ここに.aspxがあります:
<asp:UpdatePanel ID="Panel3" runat="server" OnLoad="Panel3_Load" UpdateMode="Conditional">
<ContentTemplate>
<asp:Literal ID="ChatBoxesLiteralTop" runat="server" />
<asp:Literal ID="ChatBoxesLiteralMid" runat="server" />
<asp:PlaceHolder ID="ChatBoxesPlaceHolder" runat="server" />
<asp:Literal ID="ChatBoxesLiteralBot" runat="server" />
<div id="UserListCorner">
<img id="UserListBtn" src="images/list.png" />
</div>
<div id="UserList" class="UserListHidden">
<div id="UserListView">
<asp:Literal ID="UserListViewLiteral" runat="server" />
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
コードビハインド:
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 += "<div class='UserListEntry'><span class='UserListEntryStatus'><img src='images/status-online.png' width='10' /></span> <span class='UserListEntryName'>" + dt.Rows[i]["FullName"].ToString() + "</span></div>";
}
RadAjaxManager.GetCurrent(Page).ResponseScripts.Add("ChatAjax()");
}
private void CreateChatBox()
{
ChatBoxesLiteralTop.Text = @"<div id='ChatBox' class='ChatBoxHidden'>
<div class='ChatBoxHeader'>
<img id='ChatBoxStatusBtn' src='Images/status-online.png' />
<span id='ChatBoxUserLabel'>John Doe</span>
<img id='closeBtn' src='Images/close.png' />
<img id='toggleTab' src='Images/up-arrow.png' />
</div>
<div id='ChatBoxMessageOutput'></div><div class='ChatBoxFooter'>";
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 = "</div></div>";
Panel3.Update();
RadAjaxManager.GetCurrent(Page).ResponseScripts.Add("ChatAjax()");
}
私は確かにとてつもなく愚かなことを見落としていますが、ベテランのASP.Net Ajaxerからの新鮮な目が本当にありがたいです!前もって感謝します。
問題の明確化
何が機能するか:
- コードは正しく実行されます。
- JSONメソッドは、コードビハインドに渡されて読み取られます。
- CreateChatBox()メソッドが実行され、リテラルとコントロールにデータが入力されるとされています。
- JSONチェーン内のすべてのコールバックが正常に実行されます。
動作しないもの:
- UpdatePanelは、冗長なポストバックの後でも、コードが正常に実行された後、この新しいHTMLを持ちません。