延迟ASP.Net异步回发,直到我的代码完成-Web表单中的占位符polyfill有问题



由于我们正在构建的第三方产品,我被迫在ASP中工作。Net webforms。项目所有者非常坚持在文本框中使用占位符文本,尽管我们的主要用户群正在运行IE9,它不支持在文本框内使用占位符文本。出于这个原因,我尝试使用jQuery插件来添加这种行为。现在我使用的是简单占位符。

这在MVC风格的网站上会很好地工作,它可以进行正常的提交,因为它绑定到表单的提交函数,并在提交之前清除所有占位符文本。这样可以防止占位符文本被发送回服务器。

在我们的WebForms项目中,我们使用了大量的UpdatePanel来防止整个页面一直刷新。这给占位符带来了一个问题。这些异步回发正在将占位符文本发送回服务器。。。因此"Name"字段会发回一个值"Enter Name here"。

所以。。。当发生异步回发时,在继续回发之前,我需要清除文本框中的所有占位符文本。

我正在接近一个解决方案。我添加了一个"beginRequest"处理程序来清除占位符文本:

<script type="text/javascript">
$().ready(function () {
// add function to handle simple placeholders before async postbacks
Sys.Application.add_init(appl_init);
function appl_init() {
var pgReqMgr = Sys.WebForms.PageRequestManager.getInstance();
pgReqMgr.add_beginRequest(
$.proxy($.simplePlaceholder.preventPlaceholderSubmit, $(document))
);
}
});
</script>

但是,这是异步发生的,所以在我更新完页面上的控件之前,回发会继续。因此,占位符文本无论如何都会被发送到服务器。

我真正想做的是等待函数返回,然后再继续回发。

我有另一个潜在的解决方案。我正在修改__dopostback函数,以便首先运行我的代码:

<script type="text/javascript">
$().ready(function () {
__doPostBack_old = __doPostBack;
__doPostBack = function (args) {
if ($.proxy($.simplePlaceholder.preventPlaceholderSubmit, $(document))()) {
__doPostBack_old(args);
}
};
});
</script>

虽然这有效,但闻起来很臭。。。我担心可能还有其他机制会启动不调用__dopostback的异步回发。

希望一切都有意义。任何想法、想法或见解都将不胜感激。

当beginRequest触发时,PageRequestManager已经获取了AJAX请求的文本框值。这就是为什么在beginRequest事件中更改文本框无效的原因。

您是否尝试在initializeRequest事件中调用preventPlaceholderSubmit?我相信此事件会在PageRequestManager构建请求之前触发。唯一的问题是用户可以取消异步回发,在不提交表单的情况下清除占位符文本

最新更新