类变量失去价值

时间:2010-10-21 15:24:19

标签: c# asp.net visual-studio-2008 class

这就是我的代码的样子。

我想知道为什么标签中的值变为空白或为空。

我想在获取数据时将值分配给用户名,并在按钮点击事件中使用它。

some1可以指导我这个,为什么会发生这种情况以及如何解决这个问题

我不想使用会话和静态。

namespace GUI
{
  public partial class Updatechild : System.Web.UI.Page
{
    string UserName;

   protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack)
        {
          //CALL A FUNCTION TO GET THE VALUE
          GetData();
        }
    }

   protected void GetData()
    {
      //VALUE assigned
       UserName= "USER1"
    }

   // button click event
   protected void Button_Click(object sender, EventArgs e)
    {
       Label.Text = UserName; //value comes as blank.
    }

}

6 个答案:

答案 0 :(得分:8)

您需要将值存储在ViewState或Session中。

通常,you need to understand the ASP.Net lifecycle和客户端 - 服务器交互模型。

答案 1 :(得分:3)

Button_Click事件发生在PostBackGetData未被调用。

答案 2 :(得分:3)

回答为什么会发生这种情况的问题:基本上每次服务器处理来自浏览器的针对该页面的请求时,ASP.NET框架都会创建UpdateChild类的新实例。

在您的方案中,发生了2个单独的请求:一个是第一次加载页面时,另一个是用户点击按钮时。

在第一次请求期间,由于请求不是回发,因此您的UpdateChild类会为UserName变量分配值。但是,由于在请求完成处理后将丢弃UpdateChild的实例,因此分配给该变量的值将丢失。如果要保留此值,则需要将其存储在页面上除类级变量之外的其他位置。最合乎逻辑的地方可能是ViewState或Session。

解决问题的一个简单方法是将UserName的声明更改为以下内容:

    string UserName
    {
        get { return ViewState["UserName"] as string; }
        set { ViewState["UserName"] = value; }
    }

答案 3 :(得分:2)

您应该从Button_Click方法调用GetData,同时GetData(string node)需要一个字符串。你只是这样称呼GetData()

答案 4 :(得分:2)

当您回发时,将重新创建整个页面,并且由于还重新创建了UserName变量,因此它的默认值为null。因此,您需要在设置其值后将此变量放在ViewState中。

答案 5 :(得分:2)

您的Page_Load事件中的条件是否是问题。第一次加载页面时,会触发此事件,并使用GetData()中的值分配UserName字符串。但是这个值必须使用viewstate或session或static变量来保持。当用户单击该按钮时,会触发page_load事件,但由于您正在检查的If条件!IsPostBack GetData()函数不会将值赋给UserName变量。因此,您的标签永远不会获得用户名值。

HTH