为什么对象会是null呢?

jekeywood 2010-12-20 12:03:51
刚才对这个问题纠结了一下,跟踪了一下就清晰了。呵呵贴子发了,供各位参考吧。。。


namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
private User u = null;
private int i = 999;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindUser();
}

}

private void BindUser()
{
u = new User();
u.UserID = 1;
u.UserName = "name";
Response.Write("i=" + i.ToString() + " ");
Response.Write(u.UserID + ":" + u.UserName);
}

/*页面的一个按钮,点击执行了一个回传事件后,整型的i的值999得到了保留。
但是为什么User对象u却仍为null呢?我在BindUser()方法中已经对其赋值了啊?*/
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write( "i=" + i.ToString() + " ");
Response.Write(u.UserID + ":" + u.UserName);
}
}

/*定义的用户类*/
public class User
{
private int _userID;

public int UserID
{
get { return _userID; }
set { _userID = value; }
}
private string _userName;

public string UserName
{
get { return _userName; }
set { _userName = value; }
}
}
}

...全文
161 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2010-12-20
  • 打赏
  • 举报
回复
生命周期的问题,整个_Default(当然包括类成员UserName)在完成一次请求后就销毁了。
要保持UserName的话,可以放在ViewState或者Session里。
i=999 是因为每次_Default都初始化成999了。(因为这一句初始化:private int i = 999;)

private User u = null;

private void BindUser()
{
var u = new User();
u.UserID = 1;
u.UserName = "name";
ViewState["User"] = u;
Response.Write("i=" + i.ToString() + " ");
Response.Write(u.UserID + ":" + u.UserName);
}

protected void Button1_Click(object sender, EventArgs e)
{
var u = ViewState["User"] as User;
Response.Write( "i=" + i.ToString() + " ");
Response.Write(u.UserID + ":" + u.UserName);
}

w290601645 2010-12-20
  • 打赏
  • 举报
回复
一楼解释的很清楚,学习了。。。
  • 打赏
  • 举报
回复
接分每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
So_CooL 2010-12-20
  • 打赏
  • 举报
回复
/*页面的一个按钮,点击执行了一个回传事件后,整型的i的值999得到了保留。
但是为什么User对象u却仍为null呢?我在BindUser()方法中已经对其赋值了啊?*/
protected void Button1_Click(object sender, EventArgs e)
{
//Response.Write( "i=" + i.ToString() + " ");
//Response.Write(u.UserID + ":" + u.UserName);

BindUser();
}
这样就可以了。
fendouaj 2010-12-20
  • 打赏
  • 举报
回复
楼上的说的好啊!顶
  • 打赏
  • 举报
回复
另外,什么 Response.Write 之类的写法,如果你真的在写asp.net程序之前学过html/javascript应该看看浏览器所获得的html代码,它根本不是一个完整的html,只不过ie的容错性比其它浏览器稍微好一点所以你似乎看到了所显示的文字。但是等你不是刚学1个月,而是几个月之后,许多的内容、样式,以及其它浏览器上的表现就很差了。因为你输出的根本不是一个真正的html。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chengbin0602 的回复:]

或者还有一个办法,不要用服务器控件,用js处理,把要显示的值传到客户端,点击 按钮时就会显示出来了。
[/Quote]

看玩笑!除了你说的“按钮”,还有服务器控件吗?
Dylan-Wang 2010-12-20
  • 打赏
  • 举报
回复
1楼和3楼的解释就比较全了,楼主应该明白了,就是页面生命周期的问题。楼主可以看看相关的问题
telankes2000 2010-12-20
  • 打赏
  • 举报
回复
2楼的解释非常好
就是那样的 看下生命周期就知道了
sugercgq 2010-12-20
  • 打赏
  • 举报
回复
u = new User(); 放到 if (!IsPostBack)上面
天下在我心 2010-12-20
  • 打赏
  • 举报
回复
或者楼主把需要一次赋值,长期保存的变量,前面加上static也可以达到效果。
全体起立 2010-12-20
  • 打赏
  • 举报
回复
或者还有一个办法,不要用服务器控件,用js处理,把要显示的值传到客户端,点击 按钮时就会显示出来了。
全体起立 2010-12-20
  • 打赏
  • 举报
回复
补充,没写完点提交了。。。
要想解决,一楼的办法很好,保存到ViewState 或 session
全体起立 2010-12-20
  • 打赏
  • 举报
回复
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write( "i=" + i.ToString() + " ");
Response.Write(u.UserID + ":" + u.UserName);
}
每次请求该页面 u 这个对象都是重新实例化的,当你执行Button1_Click 这个事件的时候,上次实例化并设置属性的对象不可能传到这次请求的页面中,页面只要一刷新原来的内容就全部不存在了,而是重新加载,重新实例化对象,重新设置属性值。
来自故乡的风 2010-12-20
  • 打赏
  • 举报
回复
楼主的问题好,1楼的解释也很好,谢谢!

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧