【问题标题】:C# and JQuery, strange behaviour on postbackC# 和 JQuery,回发时的奇怪行为
【发布时间】:2010-12-13 08:42:51
【问题描述】:

我有一个 asp.net 网站,我试图在其中插入一些 ajax 调用以在页面打开时获得一些加载时间。

场景: 在 A.aspx 页上,我使用 JQuery $(document).ready() 事件来触发 ajax 调用(通过 ajax() 方法)。 ajax 调用的目标是 B.aspx 页面(在同一站点中),该页面呈现我最终注入到现有 A.aspx 标记中的部分 html。

在调用 ajax 之后,页面无法再正确触发 __dopostback 事件。事实上,如果我尝试单击页面 A.aspx 中应该触发页面回发的预先存在的控件,则会打开 B.aspx 页面。

我试图将 B.aspx 移动到另一个站点,该站点在另一个应用程序池中运行,但 A.aspx 上的 __dopostback 调用仍试图打开 B.aspx。

来电:

$(文档).ready(函数(){ $.ajax({ 类型:“获取”, 网址:“./B.aspx”, 数据:“用户名=xxx”, 数据类型:“文本”, 错误:函数(XMLHttpRequest,textStatus,errorThrown){ $('#agentResultErrorContainer').html('错误...' + errorThrown); }, 成功:函数(数据){ $('#agentsResultContainer').html(数据); } }); ... ... ... }

其他细节: 网站在.net 2.0平台下运行

【问题讨论】:

    标签: c# asp.net jquery asp.net-2.0 postback


    【解决方案1】:

    假设您将两个页面留在同一个域中,我会建议以下内容:

    1. 关于$.ajax url 属性“./B.aspx”,就是“.”必要的?我习惯使用完整的相对路径(即“/B.aspx”本身)。

    2. 您是否尝试过启动调试器,并在 Page_Load 上为 A.aspx 和 B.aspx 设置断点?它可以帮助您推断请求发生在哪里以及发生了什么。

    3. 您是否使用像 Firebug(用于 Firefox)或 Web Developer Tools(用于 IE8)这样的插件?这些工具将帮助您查明任何 javascript 错误。我发现如果在页面上触发了 Javascript 错误,它可能会阻止未来的 javascript 函数(例如 __DoPostback)不发生,因为脚本异常结束。

    希望这些建议有所帮助。

    【讨论】:

      【解决方案2】:

      @Kobi、@David:非常感谢您的解释。在异步调用的页面上也有表单和视图状态复制,显然是在原始标记上注入的,造成混乱。

      @Kobi:我同意你的建议,转向其他范式,例如 MVC,肯定会更有效,但不幸的是,我现在只能尝试这些小改动,其他一切都保持不变。

      【讨论】:

        【解决方案3】:

        按照您在此处的操作方式,您最终会得到每个 ASP.NET 元素中的两个:两个视图状态、两个表单(名称为 name 和 id)、JavaScript 函数等(另请参阅 this similar question)。顺便说一句,这与应用程序池无关,这一切都发生在客户端。
        此外,即使您成功回发,也可能会遇到各种异常。

        解决方案?不要这样做。您可以继续使用 MVC,这更舒服,或者更有可能,您可以创建 b.ashx(通用处理程序),返回干净的 HTML(没有回发),并使用 Javascript 或使用字段处理逻辑被发布到a.aspx。 (您可以添加输入字段并使用Request.Form 读取它们)。

        另一个注意事项:我怀疑这种方法会给您带来更好的用户体验 - 他们仍然需要等待页面加载,而且可能会更慢。我会给你在另一个问题中给出的相同建议 - 用户控件是这里最简单的解决方案。

        【讨论】:

        • 我同意Kobi,回发失败肯定是因为双重控制。我会考虑按照 Kobi 的建议创建一个 .ashx,而不需要任何服务器端标记。这应该可以解决您的问题。此外,Kobi 提出了关于 AJAX 调用的有效观点,首先 Jquery 必须加载(意味着 DOM 已完全加载)才能进行调用,其次,您必须等待第二次往返服务器以获取页面.
        【解决方案4】:

        B.aspx 渲染什么?如果它是一个网络表单,那么这可能是预期的行为,因为 __dopostback 的钩子将更新为指向 B.aspx。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-18
          • 2011-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多