2016-07-07 60 views
1

私は記入する必要がある非常に長いフォームを持っています。ユーザー入力に基づいて表示/非表示を切り替えるコントロールが複数あるため、maintainScrollPositionOnPostBackが有効になっています。Asp.net maintainScrollPositionOnPostBackとフォームの検証に失敗しました

フォームが長すぎるため、ページのフォーカスとスクロールが最初に失敗したコントロールをスクロールして、検証に失敗したオプションを有効にしてください。ただし、maintainScrollPositionOnPostBackがこれをオーバーライドしているようです(コントロールはフォーカスを合わせますが、スクロールしません)。

これにはどのような対処法がありますか?これまでに試したことはすべてうまくいっていません。これはasp.net webformsプロジェクトです。

答えて

0

これは良い質問であり、実際に作業するのは難しいです。しかし、私はあなたが試みることができ、おそらく上に構築することができます1つのバージョンを得ることができました。

MaintainScrollPositionOnPostback = "true"に設定すると、フォームのサブミットとウィンドウのロード時に一連のJavaScriptイベントが設定され、バリデータによってフォーカスセットが上書きされます。

それでは、私はそうのようなすべてのバリデータに共通のCSSクラスを追加しましたでした

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" CssClass="error" ErrorMessage="RequiredFieldValidator" SetFocusOnError="true" 
    EnableClientScript="false" ControlToValidate="TextBox1"></asp:RequiredFieldValidator> 

そして、私たちはまた、Aspの1を残しておく必要があります注意してください(window.loadするために別のEventListenerを追加しました。ネットは)...ので、私たちはwindows.load =機能を行うことはできません追加しました:

<script> 
    window.addEventListener("load", function() { 
     var el = document.getElementsByClassName("error"); 
     if (el.length > 0) { 
      window.location.hash = "#" + el[0].id;     
     } 
    });   
</script> 

ここでは、より多くのブラウザをサポートすることができるように使用するjQueryの恩恵を受けるかもしれないが、addEventListenerをはpretty well supportedです。

スクリプトはerrormessageを検索し、そのIDにアンカーでフォーカスします。 Javascriptにはfocus-methodがありますが、これはフォーム要素用です。そのため、この回避策があります。

希望すると便利です。

+0

返信いただきありがとうございます!私はこれを試したところ、検証に失敗したコントロールの数を認識します。しかし、window.location.hash = "#" + el [0] .id; 'は何もしていないようです。なぜこのことが分かりませんか?私はテストとアップデートを続けるでしょう – mtNewToJava

+0

それは、ロードイベントの順序である可能性があります、このスクリプトをbody要素の最下部に置いてみてください。 – Esko

+0

はい、問題を解決しました!スクリプトをページの最後のものにする必要がありました!私は別の可能な解決策は、完全なポストバックを行う代わりに、更新パネルを使用してmaintainScrollPositionOnPostBack = "false"にすることを推測しています。あなたの助けをありがとう。 – mtNewToJava

関連する問題