まず、ASP.NET内でMS Ajaxフレームワークを操作するのは非常に新しいので、間違っているという信じられないほど単純で基本的なことがあるかもしれないことを指摘したいと思います...それを受け入れてとても幸せです!
とにかく、新しいシリアル番号をサーバーに送信し、それを検証してから、サーバー側からリストボックスコントロールを更新することで、リストボックスにアイテムを追加しようとしています。ボタンを最初にクリックすると、目的の結果が得られます。新しいシリアル番号がサーバーに送信され、リストボックスクラスのサーバーのインスタンスに追加されてから、クライアントに返送されます。ここまでは順調ですね...
残念ながら、次に追加ボタンをクリックすると、例外が発生します。
http://ajax.aspnetcdn.com/ajax/4.5/3/MicrosoftAjaxWebForms.debug.jsの行881、列13で未処理の例外
0x800a139e-Microsoft JScriptランタイムエラー:Sys.WebForms.PageRequestManagerServerErrorException:同じキーを持つアイテムが既に追加されています。
この2番目のコマンドはサーバーに到達していないようです。例外は、サーバーに到達する前にクライアント側にあるようです(ボタンクリックイベントハンドラーのサーバーにブレークポイントとトレースコマンドを配置することで、これを確認しました)。
それがどのキーを参照しているかわからないし、javascriptのネストを通して問題を追跡しようとするajaxフレームワークに精通していません!
ボタンとテキストボックスしかない場合でも問題が発生するため、問題はリストボックスの使用とは関係ありません。
ASPコードと、この問題を再現できる非常に単純なアプリケーションの背後にあるコードを含めました。誰かがこの例外に光を当てることができれば、私はそれを大いに感謝します-私がこれまでに行った検索は、データバインディングを使用している人々だけを思い付き、本当に重複したキーがあります...私はどこにいるのかさえわかりませんキーを使用して!それはajaxフレームワークの内部で登録されているものだと確信しています。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxTest.aspx.cs" Inherits="AjaxTest" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager runat="server" EnableCdn="true" ID="ScriptManager" />
<asp:UpdatePanel ID="ListBoxPanel" runat="server">
<ContentTemplate>
<asp:ListBox ID="lstSerialNumbers" runat="server" /><br />
<asp:TextBox ID="txtNewSn" runat="server" MaxLength="50" /><br />
<asp:Button ID="btnAddSn" runat="server" OnClick="btnAddSn_Click" Text="Add"/>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Test
{
public partial class AjaxTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnAddSn_Click(object sender, EventArgs e)
{
lstSerialNumbers.Items.Add(new ListItem(txtNewSn.Text));
txtNewSn.Text = "";
}
}
}
私が提供できる追加情報があれば教えてください。
よろしく、アンソニー