- PR -

javascriptでドロップダウンリストに追加するとサーバーエラー

1
投稿者投稿内容
アキラ
会議室デビュー日: 2003/12/16
投稿数: 9
投稿日時: 2006-12-23 06:51
vs2005を使用してasp.netの開発をしています。
下記のソースでButton1をクリックしてjavascriptでドロップダウンリストに項目を追加するとButton2をクリックしてポストバックした時に下記のサーバーエラーになります。解決方法がありましたらお教え下さい。

-------- 以下ソース
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>TEST</title>
<script language="javascript" type="text/javascript">
<!--
function AddList()
{
var opt = document.createElement("OPTION");
opt.text = "TEST";
opt.value = "TEST";
document.form1.DropDownList1.options.add(opt);
}
//-->
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server">
</asp:DropDownList>
<input id="Button1" type="button" value="button" onclick="AddList();" />
<asp:Button ID="Button2" runat="server" Text="Button" /></div>
</form>
</body>
</html>

-------- 以下エラー内容
'/WebTest' アプリケーションでサーバー エラーが発生しました。

無効なポストバックまたはコールバック引数です。イベントの検証は、構成の <pages enableEventValidation="true"/>、またはページの <%@ Page EnableEventValidation="true" %> を使用して有効にされます。セキュリティの目的により、この機能は、イベントをポストバックまたはコールバックする引数が、それらを最初に表示したサーバー コントロールから発行されていることを確認します。データが有効であり、予期されている場合、検証のためのポストバックまたはコールバック データを登録するために ClientScriptManager.RegisterForEventValidation メソッドを使用してください。
dotnetmemo
常連さん
会議室デビュー日: 2006/04/29
投稿数: 24
投稿日時: 2006-12-23 08:05
RegisterForEventValidationを使ってPOSTされるイベントを登録しておけばOKだと思います。

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
ClientScript.RegisterForEventValidation("DropDownList1", "TEST")
MyBase.Render(writer)
End Sub

なお、POSTが想定されるもの全てのデータを登録しておかないといけないので、HTMLコントロールのSELECTの利用もありかと。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-12-23 11:58
ASP.NET 2.0でエラーチェックが強化されたようですね。

こちらに詳細が説明されています。
http://odetocode.com/Blogs/scott/archive/2006/03/20/3145.aspx
http://odetocode.com/Blogs/scott/archive/2006/03/21/3153.aspx

概要を説明すると、DropDownListのListItemの情報がViewStateに保存されます。
JavaScritでDropDownListのListItemを追加するとViewStateに反映されないため
ASP.NETはDropDownListが不正に書き換えられたものと判断して、今回のエラーとします。

回避策として
1)@Pageディレクティブに「EnableEventValidation="false"」を追加する
2)Page.ClientScript.RegisterForEventValidationメソッドでDropDownListの
ListItemのValue値を登録する
などがあります。

ところが、ListItemのValue値が固定でないときは事前に登録できません。

このような場合、1)しか選択の余地がないのでは。



_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
アキラ
会議室デビュー日: 2003/12/16
投稿数: 9
投稿日時: 2006-12-23 16:53
ご回答ありがとうございます。
> 1)@Pageディレクティブに「EnableEventValidation="false"」を追加する
> 2)Page.ClientScript.RegisterForEventValidationメソッドでDropDownListの
ともにサーバーエラーを回避することができました。
ただjavascriptで項目を追加してもポストバックされると追加した項目が消えてしまいます。HTMLのSELECTも試してみましたが同様でした。これについては解決方法はあるでしょうか?
dotnetmemo
常連さん
会議室デビュー日: 2006/04/29
投稿数: 24
投稿日時: 2006-12-23 19:58
サーバーコントロールを作成するのが簡単かもしれませんね。

たとえばこんな感じのコントロール

Public Class MyDropDownList
Inherits DropDownList

Protected Overrides Function LoadPostData(ByVal postDataKey As String, ByVal postCollection As System.Collections.Specialized.NameValueCollection) As Boolean
Dim value As String = postCollection.GetValues(postDataKey)(0)
If value IsNot Nothing AndAlso Me.Items.FindByValue(value) Is Nothing Then
Me.Items.Add(value)
End If
Return MyBase.LoadPostData(postDataKey, postCollection)
End Function
End Class

この時コントロールにSupportsEventValidation属性をつけなければ、イベントのセキュリティ検証がされないので、もともとの課題の対策にもなります。
アキラ
会議室デビュー日: 2003/12/16
投稿数: 9
投稿日時: 2006-12-23 23:07
サーバーコントロールを作成することで望みの結果を得ることができました。いろいろとお教えいただきありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)