我不太了解ASP.Net,但我正在尝试为消息框创建一个新控件。您输入一些信息并按下按钮。
但是,出于某些奇怪的原因,按下按钮时,第二次调用Page_Load(),并将所有成员变量重置为null!我需要那些变量,并且Page_Load()没有理由第二次被调用!当然,callstack是没用的。
答案 0 :(得分:18)
请记住,在ASP.Net中,每当您进行任何类型的回发(包括处理按钮点击等事件)时,您都在使用必须从头开始重建的页面类的全新实例。您之前为在服务器上构建页面而完成的任何工作已消失。这意味着运行整个页面生命周期,包括您的页面加载代码,而不仅仅是点击代码。
总是两个,不多也不少。请求和回复。
答案 1 :(得分:4)
当页面回发时,调用Page_Load方法。然后,一旦服务器实际处理页面并根据更改向您发送新页面,将再次调用Page_Load,实际上是第一次在新页面上发送给您。
因此,如果要在Page_Load事件中提取数据或设置某些值,请将其括在以下块中:
if(!Page.IsPostBack)
{
}
保留你的一些州。否则,每次都会执行您放入Page_Load事件的指令。
有助于查看ASP.Net页面生命周期:)
答案 2 :(得分:1)
正如Joel所说,一旦页面被发送回客户端,实例变量将会丢失。但是,有多种方法可以存储变量的值,以便以后检索它们。如果您想了解更多内容,State Management上的此页面是一个很好的起点。
答案 3 :(得分:1)
任何需要url引用的标记/元素(如img,anchor,object等)都必须检查空引用。
e.g。 href =“”,url =“”,src =“”是一些常见错误。
答案 4 :(得分:1)
此代码适用于我:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["something"] == null)
{
Session["something"] = "1";
}
else
{
Session["something"] = null;
//your page load code here
}
}
}
答案 5 :(得分:1)
对我来说,问题有点复杂,但我发现了
protected override void OnPreRender(EventArgs e)
处理程序只调用一次,因此如果在管道中为你做的不晚,那么将一些操作放在那里会更安全。
答案 6 :(得分:1)
@ user3207728响应的扩展,我发现这个链接解释得很好并且有一个简单的解决方案......
http://www.aspdotnet-suresh.com/2010/04/detect-browser-refresh-to-avoid-events.html
不幸只检查if (!Page.IsPostBack)
是不够的,因为IsPostBack
在刷新时始终为FALSE。
答案 7 :(得分:0)
只是在黑暗中拍摄但可能在你的page_load之后添加:
if (!IsPostBack)
{
答案 8 :(得分:-1)
您可以使用会话或视图状态来保留变量的值..