在我目前的项目中,我有一个工作流程,我需要向用户显示两个连续的MessageBoxes。第一个更像是一个警告,告知用户他尝试执行的操作的风险。我正在使用链接按钮的ClientClickEvent
让用户确认操作:
<asp:LinkButton runat="server" id="lockorder"
CommandName='LockOrder'
OnClientClick="return confirm('Do you really want to lock this order?');" />
如果用户确认他确定要执行操作,则应用程序会从后面的代码执行一些验证。结果可能是,有一些未处理的任务。这是有效的,但用户应该了解它,以便有可能完成这些任务。所以我展示了第二个确认对话框,但这次是从代码背后:
if (tasksOpen)
{
ScriptManager.RegisterClientScriptBlock(
this.Page,
typeof(Page),
"Onload",
"var confirmationResult = window.confirm('There are some open tasks left, which might get closed. Do you really want to lock this order?'); if (confirmationResult) __doPostBack('ConfirmLockOrder', confirmationResult);",
true);
return;
}
为了更好的可读性,这里有一个JS-snippet可以交给客户端:
var confirmationResult
= window.confirm('There are some open tasks left, which might get closed. Do you really want to lock this order?');
if (confirmationResult)
__doPostBack('ConfirmLockOrder', confirmationResult);
在代码后面再次返回我收到此命令(例如在Page_Load
事件内)并继续执行实际操作。一切都运行良好,但有一些改变我已经完成它停止执行回发。
我使用FireBug查看了客户端脚本。 __doPostBack
- 函数(显然是自动生成的)告诉我WebForm_OnSubmit
未定义。我认为它没有定义,因为确认对话框显示在OnLoad
- 事件中,因此在表单实际加载之前。但是为什么__doPostBack
- 函数甚至需要检查此事件是否已执行,如果未定义?我可以自定义__doPostBack
- 行为吗?或者我应该选择其他活动?或者我在这里完全错了?
我希望有人能指出我正确的方向!
答案 0 :(得分:2)
基于错误(以及一些有根据的猜测),您通过ScriptManager注册的JavaScript代码在加载ASP.NET生成的其余JavaScript代码之前触发。因此,WebForm_OnLoad
未定义。
在代码执行之前,您需要确保网页已完全加载。将您的代码更改为以下内容:
window.onload=function(){
var confirmationResult = window.confirm('There are some open tasks left, '
+ 'which might get closed. Do you really want to lock this order?');
if (confirmationResult)
__doPostBack('ConfirmLockOrder', confirmationResult);
}
* 我将确认字符串分成两部分,仅用于显示目的。
如果您使用jQuery,则$(document).ready
优先于window.onload
。