13

ページの ViewState を無効にすると。その特定のコントロールに EnableViewState="true" を設定したとしても、他のコントロールが ViewState を使用することは許可されません..

ページ自体でViewStateが無効になっているときに、コントロールのViewStateを有効にすることはできますか?

EnableViewState="false" を明示的に指定せずに少数を除いてページ上のコントロールのビューステートを無効にする方法がない場合..非常に多くのコントロールに同じことを入力するのは大変です..

4

8 に答える 8

22

ページめくりの ViewState をオフに設定すると、特定のコンポーネントに対して ViewState を有効にする方法がありません。これは、ViewState が再帰的にシリアル化されるためです。そのため、Page で ViewState が許可されていない場合、その子コントロールの ViewState はシリアル化されません。

あなたの質問への答えとして、個々のコントロールで ViewState を明示的にオフにしたくないが、いくつかのコントロールの ViewState を認識しておきたい場合は、すべてのコントロールの ViewState をオフにする小さなユーティリティ メソッドを作成するのが最善の方法です (再帰を使用)もしくはそうでないか)。次に、ViewState を有効にするコントロールの ViewState を有効にします。

別の方法として、コントロールが他のコンテナー コントロール (パネルなど) 内のグループである場合は、中庸で力の弱い方法が可能です。パネルの ViewState を無効にすることで、パネル内のすべてのコントロールの ViewState を無効にできます。

于 2008-10-09T10:38:09.237 に答える
6

ページめくりの ViewState をオフに設定すると、特定のコンポーネントに対して ViewState を有効にする方法がありません。これは、ViewState が再帰的にシリアル化されるためです。そのため、ページで ViewState が許可されていない場合、その子コントロールの ViewState はシリアル化されません。

ASP.NET 4 の登場により、ViewStateModeという新しいプロパティが追加されました。このプロパティを使用すると、ページのビュー ステートが無効になっている場合でも、個々のコントロールのビュー ステートを有効にすることができます。

この新しいプロパティを利用するには、ViewStateMode を Disabled に設定する基本ページ クラスを作成するか、同じことを行う PageAdapter を作成します。web.config に viewStateMode プロパティはありません。

ページ アダプターのコードは次のとおりです。

using System.Web.UI;
using System.Web.UI.Adapters;

namespace Playground.Web.UI.Adapters
{
    public class PageAdapter: System.Web.UI.Adapters.PageAdapter
    {
        protected override void OnLoad(EventArgs e)
        {
            ViewStateMode = ViewStateMode.Disabled;
            base.OnLoad(e);
        }
    }
}

ブラウザファイルのコードは次のとおりです。

<browser refID="default">
    <controladapters>
        <adapter controlType="System.Web.UI.Page" adapterType="Playground.Web.UI.Adapters.PageAdapter" />
    </controladapters>
</browser>
于 2010-11-05T21:11:40.660 に答える
2

.NET 4.0 では、コントロール アダプターも定義できます。

namespace BB.Common.UI.Adapters
{
    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
    public class DisableViewStateControl : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void OnInit(EventArgs e)
        {
            if (Control.ViewStateMode == ViewStateMode.Inherit)
                Control.ViewStateMode = ViewStateMode.Disabled;
            base.OnInit(e);
        }
    }
}

上記のコードでは、継承時に ViewState モードが無効になっています。ブラウザ設定ファイルに次の行を追加します。

<browsers>
  <browser refID="Default" >
    <controlAdapters>
      <adapter
          controlType="System.Web.UI.WebControls.Label"
          adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" />
      <adapter
         controlType="System.Web.UI.WebControls.HyperLink"
         adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" />
      <adapter
         controlType="System.Web.UI.WebControls.ImageButton"
         adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" />
      <adapter
          controlType="System.Web.UI.WebControls.Button"
          adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" />
    <adapter
          controlType="System.Web.UI.WebControls.TextBox"
          adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" />
      <adapter
          controlType="System.Web.UI.WebControls.CheckBox"
          adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" /> 
      <adapter
          controlType="System.Web.UI.WebControls.HiddenField"
          adapterType="Fiserv.Common.UI.Adapters.DisableViewStateControl" /> 
    </controlAdapters>
  </browser>
</browsers>

このようにして、アプリケーション全体の単一のコントロールごとにビューステートをより細かく制御できます。ビューステートを制御する必要がある場合は、コードで有効にするだけです。それでおしまい。

于 2012-05-07T08:06:09.940 に答える
2

最も簡単な解決策は次のとおりです。

<%@ Page Language="C#" EnableViewState="true" ViewStateMode="Disabled" %>

ビューステートを有効にしたい場所:

<asp:yourcontrol EnableViewState="true" ViewStateMode="Enabled">

この投稿に関するシュレッダーの回答に予約されているすべてのクレジット

于 2012-06-19T17:38:21.390 に答える
2

特定のコントロールを除くすべてのViewStateを無効にする方法を持つという@Samuel Kimの概念を拡張するコードを次に示します(ところで、.NET 3.5を使用します):

List<string> allowedControls = new List<string> { "Control1", "Control3" };
IEnumerable<Control> controlsWithoutViewState = Page.Controls.Where(c => !allowedControls.Contains(c.ID));
foreach(Control c controlsWithoutViewState){
  if(c is WebControl) ((WebControl)c).EnableViewState = false;
}

私が100%確信していない(そしてVMを実行していない)唯一のことは、Page.Controlsをキャストする必要があるかどうかです。

IEnumerable<Control> controlsWithoutViewState = Page.Controls.Cast<Control>().Where(c => !allowedControls.Contains(c.ID));

上記は、何をすべきかの簡単な概念にすぎません。ViewState がある場合とない場合のネストされたコントロールは考慮されていませんが、それを処理するための再帰関数を作成することは難しくありません。

于 2008-10-09T10:53:55.663 に答える
0

組み込みコントロールをサブクラス化し、サブクラスで EnableViewState プロパティを false に設定することもできます。

于 2009-12-03T21:29:39.287 に答える
0

サミュエルのアプローチが機能するかどうかを知りたいです。試してみたら、結果を投稿してください。

サミュエルが間違っていると言っているわけではありません。

私が興味を持っている理由は、ビューステートが再帰的にシリアル化されるため (サミュエルが述べたように)、ビューステートが無効になっているコントロールの子であるビューステートが有効になっている 1 つのコントロールがある場合、子コントロールにはビューステートがないためです。親レベルで完全にスキップします。多くの子コントロールを自然に含む独自のユーザー コントロールを作成した場合、これは特に厄介です。

もう 1 つの解決策は、Samuel のユーティリティ メソッド アプローチを使用することですが、すべてを無効にする代わりに、Label、Literal などの子を持たないコントロールに対してのみ無効にします...または、子を持っている場合は、子のビューステートが無効になっていても問題ありません。

上記の理由から、パネルとプレースホルダーのビューステートを無効にすることは当然避けたいと思うでしょう。

編集:

Public Shared Sub DisableViewState(ByVal cntrl As Control)
    If TypeOf cntrl Is Label Then
        cntrl.EnableViewState = False
    ElseIf TypeOf cntrl Is Literal Then
        cntrl.EnableViewState = False
    ElseIf TypeOf cntrl Is Button Then
        cntrl.EnableViewState = False
    Else
        If cntrl.Controls IsNot Nothing Then
            For Each subControl As Control In cntrl.Controls
                DisableViewState(subControl)
            Next
        End If
    End If
End Sub
于 2009-12-03T21:26:21.103 に答える
0

BasePage から継承することもできます。BasePage で ViewState を無効にします。

/// <summary>
/// All pages inherit this page
/// </summary>
public class BasePage : System.Web.UI.Page {

    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
    }

    public bool ViewStateEnabled {
        get {
            return Page.EnableViewState;
        }
        set {
            Page.EnableViewState = value;
        }
    }

    public BasePage() {
        // Disable ViewState By Default
        ViewStateEnabled = false;
    }
}

ViewState を有効にする各ページで、Page_Load で次の操作を行います。

public partial class Products_Default : BasePage {
    protected void Page_Load(object sender, EventArgs e) {
        this.ViewStateEnabled = true;
    }
}

これにより、そのページに対してのみ ViewState が有効になります (MasterPage でオンになっていると仮定します)。注: そのページで各コントロールの ViewState を個別に設定する必要があります。

于 2009-02-09T21:19:55.053 に答える