【问题标题】:__dopostback not working as expected__dopostback 没有按预期工作
【发布时间】:2011-09-07 00:01:06
【问题描述】:

场景 1(可行) 这是我创建的 POC。 我有一个脚本管理器、一个 html 文本框、一个 ASP.NET 按钮、一个为上述按钮的 Click 事件设置了异步触发器的更新面板。对于我有的 html 文本框,onkeyup='__doPostBack('<%=ASPBUTTON.ClientID%>','')。它的工作原理,点击按钮的点击事件,更新面板异步更新。

场景 2(不起作用) 与我的实际代码库的唯一区别是我有一个 JQUERY FILAMENTGROUP datetimepicker,它的 onchange 事件被使用而不是 html 文本框的 onchange。此外,这里我的页面使用母版页。现在,我的问题是,当 datetimepicker 的 onchange 事件触发时,请求转到服务器端,但 BUTTON click 事件没有被触发。

更多细节, 我想在选择日期时间选择器时自动更新更新面板。因此,该按钮实际上将通过 css (display:none) 隐藏。

按钮 id - btnDateRangeCallback

Datetimepicker 文本框(非 ASP 控件)- dateRange

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

[请记住,我说过它适用于我的简单 POC,而在我的实际代码库中,我使用母版页来继承,因此所有这些控件都放置在 contentplaceholder 中。此外,回发正在发生,如果我在 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事件没有命中???

【问题讨论】:

    标签: jquery asp.net visual-studio updatepanel


    【解决方案1】:

    改用 UniqueID:__doPostBack('&lt;%=btnDateRangeCallback.UniqueID %&gt;', ...

    【讨论】:

      【解决方案2】:

      把你的代码改成这样:

      setTimeout(function () { __doPostBack('btnSave', '') }, 500);
      

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

      【讨论】:

        【解决方案3】:

        为什么不直接点击按钮?

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

        (理想情况下,也不要使用内联事件处理程序...)

        如果这对您不利,您可以使用__EVENTTARGET__EVENTARGUMENT 解决它(请参阅this article 获取指南)。

        【讨论】:

          【解决方案4】:

          它不起作用的原因是因为它位于内容占位符中。

          __doPostBack的第一个参数用于服务器端,客户端可以是任何东西。因此__doPostBack 被调用并根据需要提交,但在服务器上,第一个参数的值用于查找将处理事件的控件。用于查找具有匹配 UniqueId 的控件。

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

          由于在这种情况下服务器接收到的值不允许它找到控件,它不知道要触发什么事件,因此不会触发任何事件,尽管注册为回发并且 似乎有一个“__EVENTTARGET”可以让它找到控件。

          ClientId 有时会在不在 MasterPage 上时工作,特别是只要控件不在 NamingContainer 内,它就会工作。它不能在母版页中工作的原因是母版页总是有一个命名容器。

          【讨论】:

            猜你喜欢
            • 2021-10-19
            • 2020-03-18
            • 2012-06-14
            • 2014-11-15
            • 1970-01-01
            • 2012-07-02
            • 2013-03-03
            • 2015-05-18
            • 2018-12-31
            相关资源
            最近更新 更多