簡體   English   中英

如何在按鈕單擊時重新加載頁面ASP.NET C#后面的代碼中的對象

[英]How do not reload objects in code behind page ASP.NET C# on button click

我有一個簡單的按鈕:

<asp:Button ID="mybtn" runat="server" Text="My Btn"  onclick="mybtn_Click" />

和代碼背后:

protected MyCustomObject myObject;

private void Page_Load(object sender, System.EventArgs e)
{
  if (!IsPostBack)
  {
    this.myObject = new MyCustomObject();
  }
}

protected void mybtn_Click(object sender, EventArgs e)
{
  this.myObject.step(1);
}

protected void anotherbtn_Click(object sender, EventArgs e)
{
  this.myObject.step(2);
}

問題 :單擊時,調用Page_Load並且this.myObject為null。

目標是在使用相同的對象實例調用mybtn_Click之后調用anotherbtn_Click。

如何保持對象的上下文?

您不能假設為每個“用戶”保留了Page類的實例; 因此,您不能像在示例中那樣使用類變量。 為了跨多個請求存儲信息,您可以使用Session Context 有關更多信息,請參閱以下鏈接: http//msdn.microsoft.com/en-us/library/ms178581%28v=vs.100%29.aspx

在您的情況下,您可以將MyCustomObject實例存儲在會話狀態中。

private void Page_Load(object sender, System.EventArgs e)
{
  if (!IsPostBack)
  {
    Session["MyObject"] = new MyCustomObject();
  }
}

protected void mybtn_Click(object sender, EventArgs e)
{
  MyCustomObject myObject = Session["MyObject"] as MyCustomObject;
  myObject.step(1);
}

protected void anotherbtn_Click(object sender, EventArgs e)
{
  MyCustomObject myObject = Session["MyObject"] as MyCustomObject;
  myObject.step(2);
}

The web is stateless 您始終需要為每個請求/帖子創建一個新對象。

這意味着每次訪問您的頁面時,都會創建新的頁面實例並為其提供服務。

通過使用Session或序列化對象並將其保存在ViewState有幾種方法可以解決您的問題

 if (!IsPostBack)
 {
   this.myObject = new MyCustomObject();
   Sesssion["oldObject"]=this.myObject;
 }

protected void mybtn_Click(object sender, EventArgs e)
{
      if(session["oldObject"]!=null)
       {
        this.myObject=session["oldObject"] as MyCustomObject;
        this.myObject.step(1);
       }
}

protected void anotherbtn_Click(object sender, EventArgs e)
{
  if(session["oldObject"]!=null)
   {
    this.myObject=session["oldObject"] as MyCustomObject;
    this.myObject.step(2);
   }
}

this.myObject為null,因為您在回發時明確地不在 Page_Load重新創建它。

根據您的需要,您也可以

  • 刪除if (!IsPostBack)檢查,以便在每個加載上創建一個新實例; 要么

  • 如果您需要在回發之間保持相同的實例,則在創建會話后將實例放入會話中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM