过去几周我一直在旅途中,试图在一个包含大量基础设施的相当古老的应用程序中找出大量缺陷。它使用了多个第三方控件,我不可能希望在我的时间范围内修复它。其中一个缺陷归结为客户端状态的多个javascript模型。特别是一些控件希望能够挂钩到jQuery表单提交事件,而其他控件可以在原始.NET中工作(直接覆盖theForm.onsubmit
1 ),还有一些控件使用{{1}并使用Sys.WebForms
注册事件处理程序(在某些页面上)。
起初我以为我可以简单地向页面添加一个新的PageRequestManager
函数,但是我无法注入(有时)在标准版本和__doPostBack
运行拦截的代码之间运行Sys.WebForms
。如果我之后覆盖它,那么我要么不能触发WebForms内部的逻辑,要么不能触发jQuery事件。我可以在原始__doPostBack
之前注入它,但如果不禁用原始函数添加到页面,则无效。所以我提出了以下代码。
如果这是我实际尝试的唯一方法,为什么我还没有在网上找到它?有更好的方法吗?
__doPostBack
1 这是public class Form : System.Web.UI.HtmlControls.HtmlForm
{
const string DoPostBackFn = @"
<script type=""text/javascript"">
(function ($) {
window.theForm = document.forms[0];
window.__doPostBack = function (eventTarget, eventArgument) {
var originalvalues = [
theForm.__EVENTTARGET.value,
theForm.__EVENTARGUMENT.value,
theForm.onsubmit
];
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
try {
theForm.onsubmit = null;
$(theForm).submit();
} finally {
theForm.__EVENTTARGET.value = originalvalues[0];
theForm.__EVENTARGUMENT.value = originalvalues[1];
theForm.onsubmit = originalvalues[2];
}
}
};
}(jQuery));
</script>";
protected override void RenderChildren(HtmlTextWriter writer)
{
//temporarily disable the page from rendering the postback script
var fRequirePostBackScript = typeof(System.Web.UI.Page).GetField("_fRequirePostBackScript", BindingFlags.Instance | BindingFlags.NonPublic);
var isPostBackRequired = (bool)fRequirePostBackScript.GetValue(Page);
if (isPostBackRequired)
{
fRequirePostBackScript.SetValue(Page, false);
//write custom postback script
writer.Write(DoPostBackFn);
//tell the page that the script is rendered already
typeof(System.Web.UI.Page).GetField("_fPostBackScriptRendered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(Page, true);
}
//let ASP.NET do its thing
base.RenderChildren(writer);
//reset field to original value
fRequirePostBackScript.SetValue(Page, isPostBackRequired);
}
}
在页面上时显然无法做到的事情,因为它会盲目地覆盖DOM事件而不考虑已注册的内容(至少在此版本中),所以我将不得不在其他地方做点什么