[英]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.