- PR -

ドロップダウンリスト(AutoPostBack=True)での検証チェック

1
投稿者投稿内容
ベル
会議室デビュー日: 2002/12/01
投稿数: 18
投稿日時: 2002-12-01 07:07
いつも拝見させていただき、勉強させていただいております。
初心者すぎて申し訳ないのですが、実は、次のような処理で悩んでおります。

 PageディレクティブにsmartNavigation = "true"を設定し、
 テキストボックス、テキストボックスの検証コントロール、
 ボタンコントロール、ドロップダウンリスト(AutoPostBack=True)を作成します。

 @テキストボックスにエラー値を入力し、ボタンコントロールをクリック。
  検証エラーを発生させます。
 Aそのままの状態(検証エラーのまま)でドロップダウンリストをクリックし、
  PostBackを発生させます。
 
 上記動作を行うと
 以後、同一ページで再度検証エラーが発生すると、テキストボックスのエラー値
 を正常に戻してもページが更新されません。
 (正常にPostBack、イベントの実行は行われているようです。)
 smartNavigation がfalseの場合は、上記現象はありません。

 そもそも、検証エラーのままPostBackさせてしまう
 私のプログラミングに問題があると思うのですが、
 ドロップダウンリスト(AutoPostBack=True)で
 検証チェックを実行する方法(エラー時PostBackさせない方法)が分かりません。
 
 どなたかこの症状が起こる原因について、もしくは AutoPostBackを設定した
 ドロップダウンリストの検証チェック(エラー時PostBackさせない方法)
 をご存知でしたらご教授いただけないでしょうか。

 何卒よろしくお願いいたします。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2002-12-01 11:34
再現のさせ方がわからないのですが、こんなのはダメ?
コード:

void Page_Load(object sender, EventArgs e)
{
Validate();
// XXXValidator1.IsValid = Page.IsValid;
}



[ メッセージ編集済み 編集者: cats 編集日時 2002-12-01 11:37 ]
ベル
会議室デビュー日: 2002/12/01
投稿数: 18
投稿日時: 2002-12-01 18:39
catsさん早速の連絡、本当にありがとうございます。

『Validate();を実行後、検証コントロールにfalseを設定』を試しましたが、
 現象は変わりませんでした。
 クライアントサイドで送信を中止しないと同じ現象が起こるような気がします。

 下記のようなコードを記述、オペレーションをしています。
 これでは問題点があるのでしょうか?

----------------------------------------------------------------------
WebForm.aspxのコード
----------------------------------------------------------------------
<%@ Page language="c#" Codebehind="WebForm.aspx.cs"
  AutoEventWireup="false" Inherits="WebTest.WebForm"
  smartNavigation = "true"%>
<HTML>
  <HEAD>
  </HEAD>
  <body>
  <form id="Form1" method="post" runat="server">
    <asp:DropDownList id="DropDownList" runat="server" AutoPostBack="True">
        <asp:ListItem Value="1">テスト1</asp:ListItem>
        <asp:ListItem Value="2">テスト2</asp:ListItem>
        <asp:ListItem Value="3">テスト3</asp:ListItem>
    </asp:DropDownList>
    <asp:Label id="Label" runat="server"></asp:Label><br>
    <asp:TextBox id="TextBox" runat="server"></asp:TextBox>
    <asp:Button id="Button" runat="server" Text="検証"></asp:Button>
    <asp:CompareValidator id="CompareValidator1" runat="server" Type="Double" Operator="DataTypeCheck" ControlToValidate="TextBox" ErrorMessage="数字でありません!">
    </asp:CompareValidator>
  </form>
  </SCRIPT>
  </body>
</HTML>
----------------------------------------------------------------------
WebForm.aspx.cs のコード
----------------------------------------------------------------------
  ・
  ・(略)自分で記述したイベントは下記の2つのみです。
  ・
private void DropDownList_SelectedIndexChanged(object sender, System.EventArgs e)
{
    Label.Text = "AutoPostBackです";
    TextBox.Text = "0";
    Page.DataBind();
}

private void Button_Click(object sender, System.EventArgs e)
{
    Label.Text = "サーバイベント:ボタンを押しました";
    Page.DataBind();
}
----------------------------------------------------------------------
再現方法
----------------------------------------------------------------------

@テキストボックスに"zzz"という文字を入力=>検証ボタンをクリック
 結果:検証が起動し、検証コントロールに『数字でありません』と表示
Aこのままの状態でドロップダウンを選択変更
 結果:ラベルに『AutoPostBackです』を表示
    テキストボックスに"0"が代入される
Bさらにテキストボックスに"zzz"という文字を入力=>検証ボタンをクリック
 結果:検証が起動し、検証コントロールに『数字でありません』と表示

以後、例えばテキストボックスに"1"という正常な数字を入力後、
   ドロップダウンを選択変更しても、
   テキストボックスに"0"が代入されるなくなります。
   検証ボタンを押しても、正常にpostされるのですが、
   ラベルに『"サーバイベント:ボタンを押しました』という文字は
   表示されません。
   
   デバックモードで値の監視をしてみると、
   正常に代入されているように思えるのですが、
   ページには反映されないのです??。
   smartNavigation = "false"では期待値が得られます。

cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2002-12-01 19:17
Validator に EnableClientScript=false としたらどうですか?
ベル
会議室デビュー日: 2002/12/01
投稿数: 18
投稿日時: 2002-12-01 23:59
catsさん 本当にありがとうございます。助かります。

確かに、クライアント側の処理で何か起きているので
クライアント検証自体をやめ、サーバ側で検証を行いなさいということですね。

本当はAutoPostBack時も含め
全てをクライアント側で検証チェック=>Postさせないことが出来れば良いのですが、
catsさんのおっしゃる通り、
@Page_Load時に検証チェック。
Aエラー時には、後続のイベントを走らせないよう
 イベントとメソッドの関連付けを削除する。
という方法を取りたいと思います。

本当にありがとうございました。

でもなぜこの現象は、smartNavigation = "true"で起こるのでしょうか?
ご存知の方いらっしゃいましたら
又ご教授ください。
1

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