2010-10-21 47 views
0

这就是我的代码的样子。类变量损失值

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

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

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. 
    } 

} 

回答

3

要回答为什么会这样的问题:基本上服务器处理来自浏览器对于页面的请求每次,ASP.NET框架创建您的UpdateChild类的新实例。

在您的场景中,会发生2个不同的请求:一个是页面首次加载时,另一个是用户单击按钮时。

在第一次请求期间,由于请求不是回发,因此您的UpdateChild类将为UserName变量分配一个值。但是,由于UpdateChild的实例将在请求完成处理后被丢弃,因此分配给该变量的值将丢失。如果你想保留这个值,那么你需要将它存储在你的页面上的一个类级变量以外的地方。最合乎逻辑的地方可能在ViewState或Session中。

一个简单的解决问题的方法是的UserName声明更改为类似如下:

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

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

3

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

2

当你回发时,整个页面被重新创建,并且由于你的UserName变量也被重新创建,它的默认值是null。所以你需要在ViewState中设置它的值之后把这个变量放进去。

2

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

HTH