2

Webサイト用に2つのマスターページを作成しました。1つは通常の使用用で、もう1つは印刷用です。通常のマスターページには、に設定するボタンがありSession['P']ます'1'印刷マスターページに、に設定する別のボタンがありSession['P']ます'0'。また、Global.asax.pasには、使用するマスターページを決定するための次のコードがあります。

method Global.page_PreInit(sender: System.Object; e: EventArgs);
begin
  var p: System.Web.UI.Page := System.Web.UI.Page(self.Context.Handler);
  if p <> nil then   
    if Session['P'].ToString = '1' then
      p.MasterPageFile := '~/Print.Master'
    else
      p.MasterPageFile := '~/Site.Master'; 
end;

設定後Session['P']、マスターを変更するためにページをリロードする必要があります。すべてのコントロールのビューステートを保持する必要があるため、を使用できませんResponse.Redirect()。を使ってみServer.Transfer(Request.Url.AbsolutePath, True);ましたが、次のような例外が発生します。どうすれば回避できますか?

ビューステートのロードに失敗しました。ビューステートがロードされるコントロールツリーは、前のリクエスト中にビューステートを保存するために使用されたコントロールツリーと一致する必要があります。たとえば、コントロールを動的に追加する場合、ポストバック中に追加されたコントロールは、最初のリクエスト中に追加されたコントロールのタイプと位置と一致する必要があります。

4

1 に答える 1

1

回避策はありません。ポストバック後にビューステートのコントロールツリーを変更します。

マスターページのコントロール、つまり2つのマスターページと競合するコントロールのビューステートのみを無効にできます。

一般的な考え方は、問題のあるコントロールのビューステートを無効にするか、2つのマスターページで同じIDを使用して同じコントロールを使用しようとすることです。

于 2012-12-17T10:58:49.653 に答える