6

这可能是有史以来最大的菜鸟问题,但我很困惑为什么我的私有变量在一种方法中设置时会在另一种方法中重置。我的代码中有这样的东西:

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 并显示该消息。但是,当我在那之后单击删除消息时,看起来变量正在重置/与以前设置的值不同。我是否需要使用静态变量或其他东西来实现这一点?

谢谢

4

4 回答 4

6

这就是行为。当有回发时,所有变量都被重置并重新分配。您可以使用会话或视图状态或将值存储在页面上的控件中,该控件已经是视图状态的一部分,例如在隐藏字段中

public int messageID
{
   get 
   { 
      int retVal = 0;
      if(ViewState["messageID"] != null)
         Int32.TryParse(ViewState["messageID"].ToString(), out retVal); 

      return retVal;
   }
   set { ViewState["messageID"] = value; }
}
于 2012-10-25T20:26:53.777 回答
5

这是因为 ASP.NET,而不是 C#。您需要将变量保存在视图状态中。请参阅:在类中初始化的变量随着页面加载而丢失其先前的值

于 2012-10-25T20:25:25.587 回答
1

您还可以使用 Session 对象来存储请求之间所需的信息。例如:Session["messageIdString"]=value

欲了解更多信息: http: //msdn.microsoft.com/en-us/library/ms178581 (v=vs.100).aspx

于 2012-10-25T21:51:24.813 回答
1

这是因为网络是无状态的。下面是一些在页面之间传递数据的方法。

ASP.net MVC: http: //msdn.microsoft.com/en-us/library/dd394711 (v=vs.100).aspx

ASP.net 网络表单 http://msdn.microsoft.com/en-us/library/6c3yckfw(v=VS.100).aspx

希望这可以帮助。

于 2012-10-25T20:27:38.487 回答