2009-03-30 15 views
51

私は、いくつかの必須のフィールドバリデーターと検証要約コントロールを持つ単純なフォームを持っています。フォームを送信すると、クライアント検証により、フォームがページの先頭にジャンプします。確認の要約を削除すると、ページは移動しません。相続人ASP.Netの検証の要約により、ページが先頭にジャンプする

簡単な例:

<asp:TextBox ID="test" runat="server"></asp:TextBox> 
<asp:RequiredFieldValidator ID="testrequired" runat="server" ControlToValidate="test">*</asp:RequiredFieldValidator> 
<asp:ValidationSummary ID="summary" runat="server" /> 
<asp:Button ID="submit" runat="server" Text="submit" /> 

私は笑いのために必要なフィールドバリデータとMaintainScrollPositionOnPostback="true"SetFocusOnError="true"を設定しようとした - これはポストバックでなくても - 任意の運なし。この問題の解決策はありますか?

EDIT:

私はWebResource.axdによって生成されたjsファイルに問題を発見しました。 ValidationSummaryOnSubmit()関数では1行になると思われます。

line 534: window.scrollTo(0,0); 

これを削除または迂回する方法に関するアイデアはありますか?

EDIT2:

当面の回避

クイック作品:(クライアント検証を無効にする)

  • は、PageディレクティブにMaintainScrollPositionOnPostback="true"を設定し、すべての検証コントロールのためのEnableClientScript="false"を設定

    まだクライアント側のソリューションを期待しています...

    EDIT3:

    それは周りより良い仕事を思わ検証スクリプトによって呼び出されたとき、それは何もしないようにだけwindow.scrollTo()関数をオーバーライドすることです:

    <script type="text/javascript"> 
        window.scrollTo = function() { } 
    </script> 
    

    上の任意の場所に上記の追加ページはクライアントの検証をそのままにしますが、ページ全体でwindow.scrollTo()メソッドを無効にします

  • +0

    私はこれに慣れていませんが、URLの末尾に「#」を追加していますか?場合によっては、ページが先頭にジャンプします。 –

    +0

    @cory、htmlはアンカーリンクではなくサブミットボタン入力を生成しません – Adam

    +0

    edit3の場合:ページ上部に、そして下部に検証要約がある場合、これは役立ちません。一番上のものは決して焦点を当てません。 –

    答えて

    41

    つの可能な回避策:

    無効にクライアント検証とジャンプバックポスト上の位置を修正する:

    * set EnableClientScript="false" for all validation controls (disabling client validation) 
    * set MaintainScrollPositionOnPostback="true" in Page directive 
    

    はJavaScriptでscrollTo機能を無効にします。

    <script type="text/javascript"> 
        window.scrollTo = function() { } 
    </script> 
    
    +1

    <%@ Page Language = "C#" AutoEventWireup = "true" CodeFile = "Default.aspx.cs"継承= "_デフォルト" MaintainScrollPositionOnPostback = "true"%> –

    +1

    これは、ページ上に2つのサマリーがある場合(上1行、下2行目) –

    +0

    -1、私のためには機能しませんでした。私は、クライアント側とサーバー側のバリデーションが混在している。これらの方法のいずれかを使用してスクロールを修正すると、ページがもう一方のページの上にスクロールされます。両方を使用しても問題は解決しません。 – jcollum

    -2

    htmlのターゲットスキーマを設定します。

    は、ページレベルでページ上のスキーマを設定することができ先立ちVS 2005にhttp://msdn.microsoft.com/en-us/library/6379d90d(VS.71).aspx

    を試してみてください。

    単なる考えです。

    +0

    私は私が従うか分からない。これはブラウザ固有のものではありません – Adam

    +0

    ステートメントは一貫性がありません。思考は答えとしては適切ではありません。それらはコメントとして属します!!!!!! –

    0

    このページは、検証の概要がどこにでもジャンプします。下部に近づけたい場合は、送信ボタンの近くに検証要約を下に移動します。

    EDITの場合、検証サマリをオフにすることもできます。

    +0

    @sausemaster、検証の要約をどこに置いてもページは先頭にジャンプします。検証の要約を無効にしても、それは飛び回ることはありませんが、残念ながらそれが必要なものは – Adam

    +0

    です。私はあなたが何か似たようなものがクリックされたときにコントロールコールフォーカスを持つためにいくつかのjavascriptを書いているかもしれないと思います。このフォーラム(http://forums.asp.net/t/1089469.aspx)のトピックはすばやくGoogle検索によって返されました。申し訳ありませんが、運が最高です。 – AndyG

    +0

    私は3つのサマリーを持っており、常にトップにジャンプします。 – thomasb

    -1

    おそらく、必要なfieldvalidatorを継承し、カスタムコントロールでクライアント側の検証をオーバーライドできますか?

    0

    私はに実行していましたMaintainScrollPositionOnPostback=trueを使用すると が動作しますが、クライアント側の検証スクロール位置が壊れるという問題がありました。そこで、検証要約コントロールをポストバックのビューに表示するためのスクリプトを追加しました。

    private void FocusControlOnPageLoad(Control ctrl) 
        { 
    
         this.Page.ClientScript.RegisterClientScriptBlock(
          typeof(System.Web.UI.Page), "ctrlFocus", 
         @"<script> 
           function ScrollView() 
           { 
           var el = document.getElementById('" + ctrl.ClientID + @"') 
           if (el != null) 
           {   
            el.scrollIntoView(); 
            el.focus(); 
           } 
           } 
           window.onload = ScrollView; 
         </script>"); 
        } 
    

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
        if (Page.IsValid == false) 
         { 
          FocusControlOnPageLoad(TheValidationSummary); 
         } 
    } 
    

    私もscrollTo機能が消さ持たなければならないようだ:

    window.scrollTo = function() { 
          return true; 
         } 
    

    コード(主に)from hereを手に入れました。

    15

    Microsoft Connectに記載されているように、これはknown bugです。 relevant issueは、周りの最高の仕事の基礎を持っています

    var ValidationSummaryOnSubmitOrig = ValidationSummaryOnSubmit; 
    var ValidationSummaryOnSubmit = function() { 
        var scrollToOrig = window.scrollTo; 
        window.scrollTo = function() { }; 
        var retVal = ValidationSummaryOnSubmitOrig(); 
        window.scrollTo = scrollToOrig; 
        return retVal; 
    } 
    
    +5

    この問題のコメントの回避策は、検証グループを考慮しておらず、グローバル変数に新しい変数を導入しています。問題の回避策のタブでは、これらの問題を考慮した最新の回避策を掲載しました。ここで – bdukes

    +2

    は@bdukesの更新の回避策である、場合にリンクされたページが見つからない行く: '(関数(){ VAR originalValidationSummaryOnSubmit = window.ValidationSummaryOnSubmit; window.ValidationSummaryOnSubmit =機能(validationGroup){ VAR originalScrollTo = window.scrollToは; window.scrollToは=関数(){}; originalValidationSummaryOnSubmit(validationGroup); window.scrollToは= originalScrollTo;} }()); ' –

    +0

    @Fredericは、あなたはそれに満ち答えとしてその更新の回避策を投稿する必要があります承認されたCleekとbdukesと共に投票することができます。 –

    11

    の代わりに無差別にすべてのポストバックのためScrollTo機能をオーバーライドします

    <script type="text/javascript"> 
        window.scrollTo = function() { return true; } 
    </script> 
    

    、私はボタンの私のOnClientClickイベントで関数を置きます。以下のように。

    onClientClick="window.scrollTo = function(x,y) { return true; };" 
    

    最高の解決策であるかどうかはわかりませんが、それは私の仕事です。

    私はこの使用
    +0

    他人が発見した他の落とし穴を避けて素晴らしい作品です。 +1 – EvilDr

    +1

    ボタンがクリックされてからscrolltoが失われるまで、一度動作します –

    5

    :このビットが含ま

    <a class="custom_valsum_anchor" /> 
    <asp:ValidationSummary ID="valSum" runat="server" EnableClientScript="true" /> 
    

    :(jQueryとjquery.scrollToが必要です)

    まずあなたがそうのように、あなたの検証の概要上記の特定のクラスでアンカーを置きますJavaScriptを:

    $(document).ready(
         function() { 
          var $valSum = $(".custom_valsum_anchor"); 
          if ($valSum.size() > 0) { 
           var backup_ValidationSummaryOnSubmit = ValidationSummaryOnSubmit; 
           ValidationSummaryOnSubmit = function (validationGroup) { 
            var backup_ScrollTo = window.scrollTo; 
            window.scrollTo = function() { }; 
            backup_ValidationSummaryOnSubmit(validationGroup); 
            window.scrollTo = backup_ScrollTo; 
            setTimeout(function() { $("body").scrollTo($valSum); }, 1); 
           }; 
          } 
         } 
    
    ); 
    

    Basicaly、それは置き換えられ、必要に応じて、バージョンTHAとValidationSummaryOnSubmit機能tは一時的にwindow.scrollToを無効にし、アンカーにスクロールします。 jqueryを使用しないように変更するのは難しいことではありません。

    9

    cleek's answerで示されているように、これは回避策があるknown bugです。

    ここにはbdukes oneがありますが、これは現在入手可能な最高のものです。

    (function() { 
        var originalValidationSummaryOnSubmit = window.ValidationSummaryOnSubmit; 
        window.ValidationSummaryOnSubmit = function (validationGroup) { 
        var originalScrollTo = window.scrollTo; 
        window.scrollTo = function() { }; 
        originalValidationSummaryOnSubmit(validationGroup); 
        window.scrollTo = originalScrollTo; 
        } 
    }()); 
    

    (彼はここで直接SOにそれを投稿していませんし、今 connect issueがアクセスを困難に彼の回避策をレンダリング見られるの登録を必要としているようです。)