2011-12-02 12 views
8

右にnullで、私はここで起こって非常に独特な何かを持っている...ViewStateはポストバック

次のプロパティを持つASP.NET 4ページには、 (!Page.IsPostBack)では、QuickShopBagInstanceに値が設定され、ViewStateが保存されます。

ただし、ページ上でポストバックを実行すると、ポストバックButton_OnClick()イベントからアクセスするとViewStateは空になります。

私はRequest.Formをチェックして、_Viewstateの値が十分にあり、入力されていることを確認しました。また、この値をパーサーで実行し、期待されるデータが含まれている場合、ページにはViewStateEnabled = "true"および新しい.NET 4 ViewStateMode = "Enabled"が表示されます。

私はLoadViewStateメソッドをオーバーライドして、起動中かどうかを確認しましたが、そのようには見えません。

protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 
} 

私は本当に何が問題になる可能性があるかについて本当に失われています。何か案は?

+0

あなたはviewstateにstuffを入れるプロパティを設定するために使用しているロジックを表示しません。 Probabilyポストバックの間に何か間違っています –

+1

ちょうどthis.QuickShopBagInstance =新しいQuickShopBag()が初期ロード時にあると仮定します。私はすでに、私がポストバックで渡されたviewstateデータを検証していて、それが正しいとも言っていました。 –

+0

QuickShopBagクラス定義を投稿してください。本当にプロパティは必要ありません。 – Asken

答えて

9

ファーストを行っていることをよりよく説明を与え、私はあなたができると言うものを読んでいないものの、問題のコードは」をPage_Loadではなく、Page_InitではありませんでしたInitでViewStateに割り当てます。

だから私は、あなたが「/quickshop.aspx?add1,add2,add3を」と言う要求した場合、リストビューがある

<form id="form1" runat="server"> 
<div> 
    <asp:ListView id="QuickshopListView" runat="server"> 
     <LayoutTemplate> 
      <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
     </LayoutTemplate> 
     <ItemTemplate> 
      <asp:TextBox ID="txtItem" runat="server" Text='<%# Container.DataItem %>' /> 
      <asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_Click" /> 
      <br /> 
     </ItemTemplate> 
    </asp:ListView> 
    <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> 
</div> 
</form> 

public partial class Quickshop : System.Web.UI.Page 
{ 
    protected QuickShopBag QuickShopBagInstance 
    { 
     get { return (QuickShopBag)ViewState["QuickShopBag"]; } 
     set { ViewState["QuickShopBag"] = value; } 
    } 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      if (QuickShopBagInstance == null) 
       QuickShopBagInstance = new QuickShopBag(); 

      if (!String.IsNullOrEmpty(Request.QueryString.ToString())) 
      { 
       string[] items = Server.UrlDecode(Request.QueryString.ToString()).Split(','); 
       if (items.Length > 0) 
       { 
        foreach (string item in items) 
        { 
         QuickShopBagInstance.QuickShopItems.Add(item); 
        } 
       } 
      } 
     } 
    } 

    protected void Page_LoadComplete(object sender, EventArgs e) 
    { 
     QuickshopListView.DataSource = QuickShopBagInstance.QuickShopItems; 
     QuickshopListView.DataBind(); 
    } 

    protected void btnAdd_Click(object sender, EventArgs e) 
    { 
     if (QuickShopBagInstance == null) 
      QuickShopBagInstance = new QuickShopBag(); 

     QuickShopBagInstance.QuickShopItems.Add("add1"); 
     QuickShopBagInstance.QuickShopItems.Add("add2"); 
     QuickShopBagInstance.QuickShopItems.Add("add3"); 
    } 

    protected void btnDelete_Click(object sender, EventArgs e) 
    { 
     Button DeleteButton = (Button)sender; 
     ListViewDataItem item = (ListViewDataItem)DeleteButton.NamingContainer; 
     QuickShopBagInstance.QuickShopItems.RemoveAt(item.DisplayIndex); 
    } 
} 

[Serializable] 
public class QuickShopBag 
{ 
    public List<string> QuickShopItems { get; set; } 

    public QuickShopBag() 
    { 
     this.QuickShopItems = new List<string>(); 
    } 
} 

...一緒に私がいる問題を複製し、非常に基本的なテストを置きますqのデータが正しく設定されていますが、削除ボタンをクリックすると、ViewStateがQuickShopBagオブジェクトを永続化していないため、NullReferenceExceptionがスローされます。

しかし、QuickShopBagInstance(およびViewState)に同じ値を追加する「追加」ボタンをクリックすると、ListViewに正しく入力され、「削除」ボタンをクリックするとViewStateとして完全に機能します永続している。

これで、Page_InitCompleteではなく、Page_InitCompleteに読み込み文字列を変更すると、完全に動作します。だから結論は...

あなたはInit_Complete !!!!!!!!の前にビューに追加できません

私の愚かなこと、誰でもそれを書いた人は、少なくとも!

+0

これは:http://msdn.microsoft.com/en-us/library/ms178472.aspxは、ページライフサイクルにおけるイベントのための素晴らしいリソースです。良い機会に私を助けました。 – Dave

1

あなたはので、私はあなたが上方に設けられた唯一の情報で、基本的なページを作成しました、これまでの提案のほとんどを支配しているように見える:

背後

クラス

namespace SO_Questions 
{ 
    [Serializable()] 
    public class QuickShopBag 
    { 
     public string MyProperty { get; set; } 
    } 
} 

コード

namespace SO_Questions 
{ 
    public partial class TestPage : System.Web.UI.Page 
    { 
     protected QuickShopBag QuickShopBagInstance 
     { 
      get { return (QuickShopBag)ViewState["QuickShopBag"]; } 
      set { ViewState["QuickShopBag"] = value; } 
     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       this.QuickShopBagInstance = new QuickShopBag() { MyProperty = "Test String" }; 
      } 
      Message.Text = "Value is: " + this.QuickShopBagInstance.MyProperty.ToString(); 
     } 

     protected override void LoadViewState(object savedState) 
     { 
      base.LoadViewState(savedState); 
     } 

     protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      btnSubmit.Text += QuickShopBagInstance.MyProperty; 
     } 
    } 
} 

マークアップ:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="SO_Questions.TestPage" ViewStateMode="Enabled" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"><title></title></head> 
<body> 
    <form id="form1" runat="server"><div> 
     <asp:Label ID="Message" runat="server"></asp:Label> 
     <asp:Button runat="server" ID="btnSubmit" Text="Submit" OnClick="btnSubmit_Click" /> 
    </div></form> 
</body></html> 

これは正常に動作します。オーバーライドされたLoadViewStateメソッドがヒットし(viewstateに2つのアイテムが正しく含まれます)、ボタンのテキストが更新されます。

論理的な説明は、別の場所で何か他のことが起こっているか、追加の顕著な情報を提供できなかったことです。過去に私をトリップした

0

何か

  1. は、ユーザーコントロールでそれを取得しようと次に、ページ内のViewStateで何か
  2. を設定しています。それを見つけることができません - どこに行ったのですか?

ページごとに1つのViewStateを持つ必要があるようですが、各ユーザーコントロールは独自のバージョンを保持しているようです。

これはなんですか?

このSO linkは、私はちょうど私が間違っていたすべての