2012-01-25 4 views
1

私はASP.NETサイトを持っています。ある時点で、ポストバックがトリガーされ、サーバー上でいくつかのデータが変更され、レスポンスが送信されます(新しいビュー状態で)。 問題は、jQueryを使用してその応答の一部のみをページに表示することです。それは動作しますが、新しい値でビューステートを更新する際に問題が発生します。 は、私はこのようなsomethigありますポストバックからビューステートを更新する

var updatePreviewArea = function (nid) { 
    var $content = jQuery('<div></div>'); 
    $content.load('http://site.com?nid=' + nid, function (response) { 
     var $response = jQuery(response); 

     jQuery('targetDiv1').replaceWith($response.find('#srcDiv1')); 
     jQuery('targetDiv2').replaceWith($response.find('#srcDiv2')); 

     // update viewstate from postback response 
     var selectors = ['#__VIEWSTATE', '#__EVENTVALIDATION']; 
     for (var i in selectors) { 
      var value = $response.find(selectors[i]).val(); 
      jQuery(selectors[i]).val(value); 
     } 
    }); 
} 

をしかし、この後、私は得る:

Sys.WebForms.PageRequestManagerServerErrorException: Sys.WebForms.PageRequestManagerServerErrorException: ビューステートMACの検証は失敗しました。このアプリケーションがWebファームまたは クラスタによってホストされている場合は、構成で同じ validationKeyと検証アルゴリズムが指定されていることを確認してください。 AutoGenerateは クラスタで使用できません。呼び出しメソッド:[nsIDOMEventListener :: handleEvent]

+0

jQueryで読み込んでいるページは元のページと同じですか?あなたはウェブファームを持っていますか? –

+0

これは同じページではなく、ファームではありません(しかし、すでにマシンキーを設定しています)。 – mlaen

答えて

3

サーバーから返されたviewstateを取得して、コンテンツページを更新しています。 ViewStateは、基本的にエンコードされた名前と値のペアで、関連するページのコンテンツと一致する必要があります。あるページのViewStateを別のページに貼り付けると、暗号化された値が一致せず、見た目に似たエラーが表示されます。

あなたはサーバーからコンテンツを動的に取得するためにjQueryとAJAXを使用しているため、ViewStateに依存する理由はわかりません(ただし、アプリケーションには慣れていません)。

+0

はい、別のページからviewstateを使用するのは馬鹿です。私は同じページを使用するようにリファクタリングしました。私はこのアプリケーションを継承しており、ポストバックなしでajax/jqueryだけを使用するように書き直されますが、それまでは動作しています:) – mlaen

+0

ああ、継承されたアプリケーション。私の哀悼の意を表します。 :)書き直しと幸運 - あなたが正しい道にいるように聞こえる! –

+0

-1 @DavidHoerster ViewStateは、asp.netに暗号化を明示的に指示しない限り、まったく暗号化されません。エンコード!=暗号化。 – Icarus

2

これは簡単な作業ではないので、私はこのルート(手動でViewStateを更新しません)に行きません。少なくともViewStateはBASE64でエンコードされた文字列なので、常に同期させるためにかなりのJavaScriptコードを書く必要があります。私はこれが維持する悪夢になるのを見る。あなたの靴では、私は厳密にajaxを使用して、このようなポストバックを許可するか、MSにViewStateを処理させ、UpdatePanelsを使用させますが、私もそれを嫌いです。

あなたのアプリが何らかの理由でViewStateを暗号化する必要がある場合、あなたのアプリを維持するのは楽しいことではありません。

1

エンコードされた__VIEWSTATEは、それを生成したページに固有のものです。フォームがポストするページがビューステートを生成したページと一致しない場合は、ビューステート検証エラーが発生します。

  1. 同じページではなく、別のページにあなたのAJAXリクエストを送信する:2つのオプションがあります。
  2. フォームの投稿URLを他のページのURLに設定します。
関連する問題