2011-09-28 59 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(); 

    } 
} 
相关问题