0

ViewStateカスタムメイドの変数が各ページ訪問(同じブラウザセッション)(Sessionクライアント側のように)で常に利用可能か、それともページのポストバックでのみ利用可能かを考えていましたか?Requestこれは、常にパケットとサーバーからのパケットでカプセル化されるクライアント側のデータであることを私は知ってResponseいます。

私は今これをテストしていました、そして私は以下をしました:

Home.aspx:

protected void Page_Load(object sender, EventArgs e)
{
    ViewState["test"] = "test1";
}
protected void Button1_Click(object sender, EventArgs e)
{
    string test = ViewState["test"].ToString();

    Server.Transfer("Default.aspx");
}

そしてDefault.aspxで:

protected void Page_Load(object sender, EventArgs e)
{
    string test = ViewState["test"].ToString();
}

しかし、私は得NullReferenceExceptionます。つまり、は完全に新しく再生さViewState["test"]れているため、存在しないということです。ViewStateしたがって、私の結論はViewState、フォームのポストバックを実行する場合にのみ変数を使用できるということです(ただし、実際には、フォームのポストバックの後に常にリダイレクトを実行するため、ViewStateを常に使用できるわけではありません...)。

私は自分の意見で正しいですか?

4

4 に答える 4

3

ViewState は、さまざまな (またはカスタム) プロバイダーを使用してさまざまな方法で構成することも、完全に無効にすることもできます。ただし、デフォルトのプロバイダーはフォームフィールドであるため、そうです。そのデフォルト構成の場合、POST にのみ存在し、GET には存在しません。転送は、基本的に GET のように動作します。

無関係なページ間でデータが必要だが、ユーザー関連のデータが必要な場合は、セッション状態または Cookie ベースのものを使用します。

無関係なニュース: ビューステートは多くの点でかなりひどいものです - 子猫のことを考えてみてください!

于 2012-06-05T12:53:51.640 に答える
1

ここで行ったことは、ASP.NET Web フォーム内の理解の基本的なポイントの 1 つと、HTTP のステートレスな性質を抽象化する方法に出くわしたことです。

セッション変数とViewstateの違いは単純です。

  • セッションはサーバー側に保存され、ブラウザが認識された Cookie を返すときに生成されます
  • ビューステートは非表示のタグ内に完全にクライアント側に保存されます。つまり、ポストバックごとに新しく送信されます<input>

経験したように、Session は複数のページにまたがって存在できますが、Viewstate は同じページに投稿する場合にのみ使用できます。

于 2012-06-05T12:53:18.627 に答える
1

HttpServerUtility.Transfer Method (String, Boolean) URL とパラメーターを使用するとtrue、QueryString および Form コレクションが保持されます。ただし、2 ページ目から直接 ViewState にアクセスすることはできません。ビューステートにアクセスする方法は次のとおりです。

ホーム.aspx:

protected void Page_Load(object sender, EventArgs e)
{
    ViewState["test"] = "test1";
}

protected void Button1_Click(object sender, EventArgs e)
{
    Server.Transfer("Default.aspx", true);
}

// adding this method to return view state

public StateBag ReturnViewState()
{
    return ViewState;
}

Default.aspx: ここでは、PreviousPage を使用して、そのページでメソッドを呼び出し、ビュー ステートを取得できます。

private StateBag PreviousPageViewState
{
    get
    {
        StateBag returnValue = null;
        if (PreviousPage != null)
        {
            Object objPreviousPage = (Object)PreviousPage;
            MethodInfo objMethod = objPreviousPage.GetType().GetMethod
                    ("ReturnViewState");
            return (StateBag)objMethod.Invoke(objPreviousPage, null);
        }
        return returnValue;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (PreviousPage != null)
    {
        if (PreviousPageViewState != null)
        {
            var text = PreviousPageViewState["test"].ToString();
        }
    }
}
于 2012-06-05T13:31:40.377 に答える
0

Page_PreRender を使用します。Pag​​e_Load は、viewstate が使用可能な状態の IIRC になる前です。

于 2012-06-05T12:54:19.520 に答える