这可能是有史以来最大的noob问题,但我很困惑为什么我的私有变量,当它们在一个方法中设置时,在另一个方法中被重置。我的代码中有这样的东西:
namespace Project.Messages
{
public partial class Inbox : System.Web.UI.Page
{
private static int selectedIndex;
private static string messageIDString;
private static int messageID;
//select message to view
protected void viewMessage(object sender, GridViewCommandEventArgs e)
{
//get index
selectedIndex = MsgInbox.SelectedIndex;
if (int.TryParse(e.CommandArgument.ToString(), out selectedIndex))
{
//get selected dataKey, convert to a int
messageIDString = MsgInbox.DataKeys[selectedIndex].Value.ToString();
messageID = Convert.ToInt16(messageIDString);
}
}
//select message to delete
protected void delBTN_Click(object sender, EventArgs e)
{
SqlCommand com = new SqlCommand("DELETE FROM Messages WHERE MessageID = @param1", conn);
conn.Open();
com.Parameters.AddWithValue("param1", messageID);
}
因此,如果我单击一条消息,将设置messageID并显示该消息。当我点击删除之后的消息时,看起来该变量正在重置/与先前设置的值不同。我是否需要使用静态变量或其他东西来实现这一目标?
由于
答案 0 :(得分:5)
这就是行为。当有回发时,所有变量都将被重置并重新分配。您可以使用会话或查看状态或将值存储在页面中的控件中,该控件已经是视图状态的一部分,例如在一个隐藏的领域
public int messageID
{
get
{
int retVal = 0;
if(ViewState["messageID"] != null)
Int32.TryParse(ViewState["messageID"].ToString(), out retVal);
return retVal;
}
set { ViewState["messageID"] = value; }
}
答案 1 :(得分:4)
这是因为ASP.NET,而不是C#。您需要在viewstate中保存变量。请参阅:variable initialized in class loses its previous value with the page loading
答案 2 :(得分:1)
这是因为网络是无国籍的。以下是一些在页面之间传递数据的方法。
ASP.net MVC: http://msdn.microsoft.com/en-us/library/dd394711(v=vs.100).aspx
ASP.net Webforms http://msdn.microsoft.com/en-us/library/6c3yckfw(v=VS.100).aspx
希望这有帮助。
答案 3 :(得分:1)
您还可以使用Session对象存储请求之间所需的信息。
例如:Session["messageIdString"]=value
了解更多信息:http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx