我有一个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。
这是电话:
$(document).ready( function() { $.ajax({ type: "GET", url: "./B.aspx", data:"username=xxx", dataType: "text", error: function(XMLHttpRequest, textStatus, errorThrown){ $('#agentResultErrorContainer').html('Error... ' + errorThrown); }, success: function(data){ $('#agentsResultContainer').html(data); } }); ... ... ... }
其他细节: 网站在.net 2.0平台下运行
答案 0 :(得分:1)
你在这里做的方式,最终得到两个元素ASP.NET:两个视图状态,两个表单(名称和id),JavaScript函数等(另请参阅this similar question )。顺便说一下,这与应用程序池无关,这一切都发生在客户端 此外,即使您成功回发,您也可能会遇到各种例外情况。
解决方案?不要这样做。你可以继续使用更舒适的MVC,或者更有可能的是,你可以创建b.ashx
(一般处理程序),返回干净的HTML(没有回发),并使用Javascript处理逻辑,或使用发布到a.aspx
的字段。 (您可以添加输入字段并使用Request.Form
读取它们。)
另一个注意事项:我怀疑这种方法会为您带来更好的用户体验 - 他们仍然需要等待页面加载,而且很可能更慢。我会在另一个问题上给你同样的建议 - 用户控件是最简单的解决方案。
答案 1 :(得分:0)
B.aspx呈现什么?如果它是一个webform,那么这可能是预期的行为,因为__dopostback的钩子将被更新为指向B.aspx。
答案 2 :(得分:0)
@Kobi,@ David:非常感谢您的解释。在async-called页面上也有form和viewstate复制,显然是在原始标记上注入,导致混乱。
@Kobi:我同意你的建议,转向其他范例,比如MVC,肯定会更有效,但不幸的是,到现在为止,我只能尝试这些小改动,将其他所有内容保留原样。
答案 3 :(得分:0)
假设您将两个页面都放在同一个域中,我建议如下:
关于$ .ajax url属性“./B.aspx”,是“。”必要?我习惯使用完整的相对路径(即“/B.aspx”本身)。
您是否尝试启动调试器,并在Page_Load上为A.aspx和B.aspx设置断点?它可以帮助您推断出请求发生的位置和发生的情况。
您使用的是Firebug(适用于Firefox)或Web开发者工具(适用于IE8)等插件吗?这些工具将帮助您查明任何javascript错误。我发现如果在页面上触发了Javascript错误,它可能会阻止未来的javascript函数(例如__DoPostback)因为脚本异常结束而不会发生。
希望这些建议有所帮助。