2011-09-28 60 views
1

我遵循指南here to save my ViewState into the database。爲了適應我的項目代碼設計,我做了一些更改,但重要的部分在那裏。但是當我植入這個解決方案時,所有我的asp:ImageButtons事件停止工作,但是常規的asp:Button似乎工作。爲什麼asp:ImageButtons的事件不起作用?在數據庫中存儲Viewstate會禁用我的asp:ImageButtons事件

代碼:

public class DatabasePageStatePersister : PageStatePersister 
{   
    //This object handles the saving and loading from database 
    CiroLightLibrary.BLL.ViewState myViewState; 

    public DatabasePageStatePersister(Page p, string GUID): base(p) 
    { 
     myViewState = new CiroLightLibrary.BLL.ViewState(); 
     myViewState.GUID = GUID; 
    } 

    public override void Load() 
    { 
     myViewState.Load(); 
     this.ViewState = this.StateFormatter.Deserialize(myViewState.Value); 
    } 

    public override void Save() 
    { 
     myViewState.Value = this.StateFormatter.Serialize(this.ViewState); 
     myViewState.Save(); 
    } 
} 

public class PageViewStateDatabaseStored : Page 
{ 
    private PageStatePersister _PageStatePersister; 

    protected override System.Web.UI.PageStatePersister PageStatePersister 
    { 
     get 
     { 
      if (_PageStatePersister == null) 
      { 
       CiroLightLibrary.BLL.ViewState myViewState = new ViewState(); 

       if (Request["__DATABASE_VIEWSTATE"] != null) 
        myViewState.GUID = Request["__DATABASE_VIEWSTATE"].ToString(); 
       else 
        myViewState.GUID = Guid.NewGuid().ToString(); 

       _PageStatePersister = new DatabasePageStatePersister(this, myViewState.GUID); 

       Literal l = new Literal(); 
       l.Text = "<div><input type=\"hidden\" name=\"__DATABASE_VIEWSTATE\" value=\"" + myViewState.GUID + "\" /></div>"; 
       this.Form.Controls.Add(l); 
      } 

      return _PageStatePersister; 
     } 
    } 
} 

而且繼承人測試頁:

public partial class test : PageViewStateDatabaseStored 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      imgButton1.CommandArgument = "1"; 
      btnButton1.CommandArgument = "1"; 
     } 
    } 

    protected void imgButton_OnCommand(object sender, CommandEventArgs e) 
    { 
     Response.Write(e.CommandArgument.ToString()); 
    } 

    protected void imgButton_OnClick(object sender, EventArgs e) 
    { 
     Response.Write("Click"); 
    } 
} 

Asp.net頁面

<form runat="server"> 
     <asp:ImageButton ID="imgButton1" runat="server" OnCommand="imgButton_OnCommand" /> 
     <asp:ImageButton ID="imgButton2" runat="server" OnClick="imgButton_OnClick" /> 

     <asp:Button ID="btnButton1" runat="server" OnCommand="imgButton_OnCommand" /> 
     <asp:Button ID="btnButton2" runat="server" OnClick="imgButton_OnClick" /> 
    </form> 
+0

您使用什麼版本的.net?在你提到的博客文章中有一個免責聲明:「在改變你的web應用程序的基本元素之前,你當然應該考慮三次[...] 請注意,這篇文章最初是在2007年編寫的,並且最近沒有經過測試.NET版本「。 – mamoo

+0

當你說,圖像按鈕不工作,你的意思是事件沒有發射,或者commandatgument沒有持續在視圖狀態並通過? –

+0

@mamoo即時通訊使用.net 3.5 –

回答

0

我試圖重寫LoadPageStateFromPersistenceMedium()SavePageStateToPersistenceMedium()代替,現在我的ASP :ImageButtons也會觸發事件。

public class PageViewStateDatabaseStored : Page 
{ 
    protected override object LoadPageStateFromPersistenceMedium() 
    { 
     CiroLightLibrary.BLL.ViewState myViewState = new ViewState(); 

     if (Request["__DATABASE_VIEWSTATE"] != null) 
     { 
      myViewState.GUID = Request["__DATABASE_VIEWSTATE"].ToString(); 
      myViewState.Load(); 
     } 

     LosFormatter myFormatter = new LosFormatter(); 

     return myFormatter.Deserialize(myViewState.Value); 
    } 

    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     CiroLightLibrary.BLL.ViewState myViewState = new ViewState(); 

     if (Request["__DATABASE_VIEWSTATE"] != null) 
      myViewState.GUID = Request["__DATABASE_VIEWSTATE"].ToString(); 
     else 
      myViewState.GUID = Guid.NewGuid().ToString(); 

     LosFormatter myFormatter = new LosFormatter(); 
     StringWriter myStringWriter = new StringWriter(); 
     myFormatter.Serialize(myStringWriter, viewState); 

     myViewState.Value = myStringWriter.ToString(); 
     myViewState.Save(); 

     ScriptManager.RegisterHiddenField(this, "__DATABASE_VIEWSTATE", myViewState.GUID); 
    } 
} 
0

我知道這是一箇舊的帖子....但答案只不過是你保存viewstate而不是控制狀態。

public override void Load() 
{ 
    myViewState.Load(); 
    var pair = (Pair)this.StateFormatter.Deserialize(myViewState.Value); 
    this.ViewState = pair.First; 
    this.ControlState = pair.Second; 

} 

public override void Save() 
{ 
    myViewState.Value = this.StateFormatter.Serialize(new Pair(this.ViewState, this.ControlState)); 
    myViewState.Save(); 
} 

個人而言,我會繼承HiddenFieldPageStatePersister我PageStatePersister然後在我的保存方法寫的全局唯一標識符到ViewState屬性,並設置了ControlState-爲null,則調用基保存方法。在Load中,調用load base.load,然後從ViewState屬性獲取GUID,然後將db獲得值推送到viewstate,controlstate屬性中。這樣,我們不會修改控制樹...像這樣:

public class MyPageStatePersister : System.Web.UI.HiddenFieldPageStatePersister 
{ 


    public MyPageStatePersister(Page page) 
     : base(page) 
    { 
    } 

    public override void Load() 
    { 
     base.Load(); 
     this.CurrentKey = (Guid)this.ViewState; 
     var s = this.CurrentKey; 
     var state = SomeDAOManager.GetState(s); 
     if (state != null) 
     { 
      this.ViewState = state.First; 
      this.ControlState = state.Second; 
     } 
     else 
     { 
      this.ControlState = null; 
      this.ViewState = null; 
     } 

    } 

    public Guid CurrentKey {get;set;} 


    public override void Save() 
    { 
     if (CurrentKey == Guid.Empty) 
     { 
      this.CurrentKey = Guid.NewGuid(); 
     } 
     Guid guid = CurrentKey; 
     SomeDAOManager.SaveState(guid, new Pair(this.ViewState, this.ControlState)); 
     this.ViewState = guid; 
     this.ControlState = null; 
     base.Save(); 

    } 
} 
相關問題