输入框PostBack引起的问题

jimu8130 2008-11-06 11:12:59
今天csdn一网友突然问起如何在输入框获取回车然后跳转,并且说明跳转他通过后台一按钮的点击事件写了。我当时不假思索的说:可以在输入框(服务器端textbox)前台代码加上这样一段代码

onkeypress event

onkeypress="if(event.keyCode == 13) document.all.button1.click();"

就应该可以实现其功能了,后来该网友说有问题,说是用这个代码有点不正常。我说你把代码给我看看,于是他传了以下代码给我(缩减了和主题无关的代码)

主页面前台.aspx主要代码

<%=strList[0]%>

<%=strList[2]%>

<%=strList[3]%>

<asp:TextBox runat="server" ID="xx" onkeypress="if(event.keyCode==13) document.getElementById('ibtn').click();" />

<asp:ImageButton runat="server" ID="ibtn" onclick="ibtn_Click" />

主页面后台.cs主要代码

public List<string> strList = new List<string>();

protected void Page_Load(object sender, EventArgs e)

{

if(!IsPostBack)

{

DataTable dt = GetData(); //GetData返回的是一个datatable,但是不一定有数据。

for(int i=0;i<dt.Rows.Count;i++)

{

strList.Add(dt.Rows[i][0].ToString());

}

}

}

protected void ibtn_Click(object sender, EventArgs e)

{

string searchname = xx.Text.ToString();

Response.Redirect("result.aspx?user=" + searchname);

//Server.Transerfer("result.aspx?user=" + searchname);

}

result.aspx主要代码

<%=strList[0]%>

<%=strList[1]%>

<%=strList[2]%>

result.cs主要代码

public List<string> strList = new List<string>();

protected void Page_Load(object sender, EventArgs e)

{

if(!IsPostBack)

{

DataTable dt = GetData(); //GetData返回的是一个datatable,但是不一定有数据。

for(int i=0;i<dt.Rows.Count;i++)

{

strList.Add(dt.Rows[i][0].ToString());

}

}

}

我简单的看了下代码,想当然的说应该不是你代码的问题,可能是你的ie有问题吧,但是网友修复ie后仍然出现这个问题,据说用其他同事的机器仍然会出现问题。这时我才问他到底是什么问题有什么现象了? 他说:

1. 给相关方法的最上层下断点,可是当输入框按回车时大多数时候并未执行按钮的后台代码,不过有时候还是会进去。

2. 到最后页面会报错错误信息就是主页面的strList没有数据。 我在自己机器上面只用了这些代码测试了下也发现了他说的问题,不过我调试的时候就一直没发现执行按钮的后台代码。

从网上搜索了下中文网页,其中有个人说:输入框回车触发回传不是asp.net设定了而是html标准是这样的。通过这句话我推测可能是输入框的回传先于点击按钮触发回传执行。于是我修改了下输入框的onkeypress事件代码以阻隔输入框回车的影响:

onkeypress event

onkeypress="if(event.keyCode == 13) { event.returnValue = false;document.all.button1.click();}"

这样修改代码,跳转就正常了。后来我就寻思未修改前:到底document.***.click()有没有执行了?于是我又改动了代码:

onkeypress event

onkeypress="if(event.keyCode == 13) { document.all.button1.click();alert('xxxx');}"

嘿嘿居然发现先跑到了page_load然后又执行了按钮点击的后台代码,但是最后页面还是停留在了主页面上(就算我去掉主页面的if(!IsPostBack))。不过如果我把alert放到document.**.click()前面后又恢复到最开始的问题:按钮点击后台代码并未执行。

于是我推测:

1 假如不加alert语句可以认为按钮点击的产生postback和输入框默认的postback同时发生,而ie可能只认输入框的postback,而忽略了按钮的postback。

2 由于后加的alert语句将输入框产生的回传滞后了,使得其回传晚于按钮点击产生的回传,因此就会产生两次回传,因此程序会执行跳转,也会执行输入框的postback,并将最后postback的请求响应返回给客户端(输入框的postback并未有任何实质性动作,而点击按钮postback可能优先级不如输入框postback,所以最终返回的还是主页面)。而后者不会执行if(!IsPostback)里面的东西从而导致主页面的strList没有数据进而出现错误。

如果o以上论述有任何错误,请各位老大不吝赐教。

...全文
393 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimu8130 2008-11-06
  • 打赏
  • 举报
回复
to ytycoffe 偶来发表一下个人的一点愚见,文本框控件里面按回车,默认触发的是表单的submit()事件,加入

----
en,请继续,如果有例子来论证是最好了
ytycoffe 2008-11-06
  • 打赏
  • 举报
回复
偶来发表一下个人的一点愚见,文本框控件里面按回车,默认触发的是表单的submit()事件,加入
onkeypress="if(event.keyCode==13) document.getElementById('Button1').click();"
后,文本框里先执行的是document.getElementById('Button1').click(),但是这时候,click不会马上提交表单,而是执行表单的submit()事件,这样后面的submit()事件就会把前面的document.getElementById('Button1').click()触发的表单提交覆盖掉,所以最终后台不会执行按钮里面的方法。
gengwanshanreally 2008-11-06
  • 打赏
  • 举报
回复
先顶一下
jimu8130 2008-11-06
  • 打赏
  • 举报
回复
@周公:其实就是利用客户端脚本模拟按钮点击提交表单。

个人觉得模拟这个词不太恰当,应该说是触发。因为本人目前的试验还是不够全面因此还没找到这些问题的实质原因,比如:为什么两次回传执行了一次,是不是真的是如我说的输入框回传取代了点击按钮回传或者说点击按钮回传根本就没触发了?等等,因此想看各位大大有没有类似的经验能带给我点灵机。
claymore1114 2008-11-06
  • 打赏
  • 举报
回复
来一个 UP
ytycoffe 2008-11-06
  • 打赏
  • 举报
回复
jf
kfps8kfps8 2008-11-06
  • 打赏
  • 举报
回复
顶一个
jimu8130 2008-11-06
  • 打赏
  • 举报
回复
zzzzz,请大家尽量针对问题提出自己的看法以及论证。
周公 2008-11-06
  • 打赏
  • 举报
回复
其实就是利用客户端脚本模拟按钮点击提交表单。
twtetg 2008-11-06
  • 打赏
  • 举报
回复
UP!
jiang_jiajia10 2008-11-06
  • 打赏
  • 举报
回复
UP
phper2008 2008-11-06
  • 打赏
  • 举报
回复
高手大哥的论述小弟不敢妄自评论了,只好第一个来接分了!

支持是硬道理!
w87162960 2008-11-06
  • 打赏
  • 举报
回复
頂下
ytycoffe 2008-11-06
  • 打赏
  • 举报
回复
to jimu8130 :

这是WebForm程序的多线程只能跟踪一条线程的,建议你只在按钮事件里设断点,不要在Page_Load里设断点,而且每次只设一个断点,这样你就可以看到是具体情况了.比如你只在
protected void Button2_Click(object sender, EventArgs e)
{
strButton2 = "Button2事件被执行了";//这里设置断点
Response.Write("结果Button1:" + strButton1 + "<br />结果Button2:" + strButton2);
}
设断点,别的地方的断点千万要去掉,再看结果.
Riverwcj 2008-11-06
  • 打赏
  • 举报
回复
我也来顶一下...呵呵...
jimu8130 2008-11-06
  • 打赏
  • 举报
回复
to ytycoffe:
我就一直没显示过2,我一般都是按f5,然后page_load一个断点,每个按钮事件的首大括号下个断点,没有alert的时候,回车一次看结果,然后shift+f5退出,再次f5运行测试,每次结果都是0;假如有alert的会显示为1!为了排除static变量的影响只能这样。

你的代码我也如同这样的来测试,但是每次都不会执行按钮的后台代码事件(没有alert语句)。
nlqtonglin2006 2008-11-06
  • 打赏
  • 举报
回复
up
ytycoffe 2008-11-06
  • 打赏
  • 举报
回复
to jimu8130 :

我想你是设断点测试的吧,你把断点设在

protected void Button2_Click(object sender, EventArgs e)
{
strButton2 = "Button2事件被执行了";//这里设置断点
Response.Write("结果Button1:" + strButton1 + "<br />结果Button2:" + strButton2);
}

试试
ytycoffe 2008-11-06
  • 打赏
  • 举报
回复
to jimu8130 :

不是吧,居然是这样??

你的代码列也测试了一下,

刚开始页面显示的是

postback page_load ;0

刚开始输入框回车显示的结果:
postback page_load ;1


然后来又重新编译测试了8,9次结果一直都是:
postback page_load ;2

奇怪了

jimu8130 2008-11-06
  • 打赏
  • 举报
回复
to ytyconffe:
测试工程已经发送。

你的我也做了测试,我这边显示当页面开始显示的时候结果是:

清空变量
结果Button1:
结果Button2:



当输入框回车后显示结果:

结果Button1:
结果Button2:


加载更多回复(41)

62,074

社区成员

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

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

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

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