UpdatePanel AsyncTriggers升级到4.0后无法正常工作

时间:2011-03-08 18:21:42

标签: asp.net .net-4.0 asp.net-ajax

最近,我将我的解决方案升级到4.0,并且所有内容似乎都已顺利升级,但是对于ASP.NET AJAX。

我有一个像这样的UpdatePanel:

<asp:UpdatePanel ID="pnlAdvSearch" UpdateMode="conditional" runat="server">
  <ContentTemplate>  
      <asp:Button ID="btnHidden" Runat="server" OnClick="btnHidden_Click"
              ClientIDMode="Static"/>
  </ContentTemplate>
  <Triggers>
      <asp:AsyncPostBackTrigger ControlID="btnHidden" EventName="Click"/>
  </Triggers>
</asp:UpdatePanel>

我有一个提前输入文本框,可以在Click / Enter等上触发btnHidden_Click事件。我在文本框上调用以下方法点击/输入。

  function getSelectionId() {     
      __doPostBack(
          '<%=btnHidden.ClientID%>',
          document.getElementById('<%=txtLocation.ClientID %>').value
      );
      theForm.__EVENTARGUMENT.value = "";
  }

我可以看到发生回发并且Page_Load正在执行。但是,服务器端btnHidden_Click永远不会被解雇。我不想在页面级别禁用事件验证。我在这做错了什么? :(

2 个答案:

答案 0 :(得分:1)

首先,确保将程序集设置为以.NET 4.0 Framework为目标,然后查看web.config文件。您可能会对可以删除的ASP.NET 2.0下执行ASP.NET AJAX操作所需的设置进行大量引用。

具体来说,请检查<compilation><httpHandlers>下的<system.web>代码和system.webServer代码。

例如,您可能会在编译&gt;下看到如下内容:组件:

<compilation>
  <assemblies>
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
</compilation>

最有可能删除这些引用。此外,<pages><httpHandlers><httpModules>下的一系列设置也可能会被移除。

<pages>
  <controls>
    <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  </controls>
</pages>
<httpHandlers>
  <remove verb="*" path="*.asmx"/>
  <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>
<httpModules>
  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

答案 1 :(得分:0)

这就是我最终在Page_Load上做的事情。

            if (Page.Request.Params.Get("__EVENTTARGET") == "btnHidden") //Workaround hack for AsyncPostBackTrigger fail
                this.btnHidden_Click(null, null);

当发生异步回发时,我只是明确地触发事件。有点hacky,但不值得花费更多的时间:)