- - PR -
javascriptでドロップダウンリストに追加するとサーバーエラー
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 メソッドを使用してください。 |
|
投稿日時: 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の利用もありかと。 |
|
投稿日時: 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サンプル集 |
|
投稿日時: 2006-12-23 16:53
ご回答ありがとうございます。
> 1)@Pageディレクティブに「EnableEventValidation="false"」を追加する > 2)Page.ClientScript.RegisterForEventValidationメソッドでDropDownListの ともにサーバーエラーを回避することができました。 ただjavascriptで項目を追加してもポストバックされると追加した項目が消えてしまいます。HTMLのSELECTも試してみましたが同様でした。これについては解決方法はあるでしょうか? |
|
投稿日時: 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属性をつけなければ、イベントのセキュリティ検証がされないので、もともとの課題の対策にもなります。 |
|
投稿日時: 2006-12-23 23:07
サーバーコントロールを作成することで望みの結果を得ることができました。いろいろとお教えいただきありがとうございました。
|
1