__dopostback未按预期工作

7

场景1(成功) 这是我创建的一个概念验证。 我有一个脚本管理器、一个HTML文本框、一个ASP.NET按钮、一个设置为上述按钮点击事件的异步触发器的UpdatePanel。对于HTML文本框,我使用了onkeyup='__doPostBack('<%=ASPBUTTON.ClientID%>','')。它可以工作,按钮的点击事件被触发并且UpdatePanel以异步方式更新。

场景2(未能工作) 与我的实际代码库唯一的区别是我使用了JQUERY FILAMENTGROUP日期选择器的onchange事件,而不是HTML文本框的onchange事件。此外,我的页面使用了主页面。现在,我的问题是当日期选择器的onchange事件触发时,请求会发送到服务器端,但BUTTON的点击事件没有被触发。

更多细节, 我想在日期选择器被选中后自动更新UpdatePanel。因此,该按钮实际上会通过CSS隐藏(display:none)。

按钮ID - btnDateRangeCallback

日期选择器文本框(非ASP控件)- dateRange

        onChange: function() {__doPostBack('<%=btnDateRangeCallback.ClientID%>',   $('#dateRange').val());}

请记住,我说它在我的简单POC中可以工作,而在我的实际代码库中,我使用主页面进行继承,因此所有这些控件都放置在内容占位符中。此外,发生了回发,如果我在Page_Load处断点,我可以看到正确发送了_EVENTTARGET和_EVENTARGUMENT。

请帮忙。

更简单地说,在回发后,当我在Page_Load处断点时,我看到Request.Form的内容为:

ctl00%24ContentPlaceHolder1%24SMgr1=ctl00%24ContentPlaceHolder1%24SMgr1%7cctl00_ContentPlaceHolder1_btnDateRangeCallback &__EVENTTARGET=ctl00_ContentPlaceHolder1_btnDateRangeCallback &_EVENTARGUMENT=5%2f3%2f2011+-+6%2f2%2f2011 &_VIEWSTATE=%2fwEPDwULLTE3NDY5NDIwMDRkZIuTqMNNsFHlRYhjpKaUCaCXj42h &_EVENTVALIDATION=%2fwEWAgLBx52kBALP6Ln6DdkkwE%2frVIKQzKE1L0k4QhIc768w &_ASYNCPOST=true&

为什么btnDateRangeCallback的Click事件没有触发?

4个回答

7
请使用UniqueID代替:__doPostBack('<%=btnDateRangeCallback.UniqueID %>', ...

1
将你的代码更改为以下内容:
setTimeout(function () { __doPostBack('btnSave', '') }, 500);

使用 "btnSave Id"。它适用于所有浏览器。

0

为什么不直接点击按钮呢?

onchange="$('#<%= ASPBUTTON.ClientID %>').click()"

(最好也不要使用内联事件处理程序...)

如果这对您来说不太好,您可以使用__EVENTTARGET__EVENTARGUMENT进行解决(请参见this article以获取指南)。


0

它不能工作的原因是因为它在内容占位符中。

__doPostBack的第一个参数用于服务器端,客户端可以是任何值。所以__doPostBack被调用并按预期提交,但在服务器上,第一个参数的值用于查找将处理事件的控件。它用于查找具有匹配UniqueId的控件。

当不在NamingContainer中时,UniqueId和ClientId相同,在NamingContainer中,ClientId使用下划线(_)构造,而UniqueId使用美元符号($)构造。

由于服务器在此情况下接收到的值不允许其找到控件,因此它不知道要触发什么事件,因此不会触发任何事件,尽管注册为回发并且显示具有“__EVENTTARGET”的东西可以使其找到控件。

当不在MasterPage上时,ClientId有时会起作用,特别是只要控件不在NamingContainer中即可。它永远不会在主页面内起作用的原因是主页面始终具有命名容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接