在拔掉头发一两天后,我设法解决了这个问题……希望这可以帮助像我一样沮丧的其他人:
任何发现这篇文章的人都知道这里的直观答案,将表单的默认按钮设置为向导的下一步按钮,没有任何作用。因此,下一个合乎逻辑的步骤是通过代表用户单击按钮来尝试围绕问题进行设计。假设我已将以下处理程序从代码隐藏中附加到我的文本框,并且 myButtonId 是我需要作为默认按钮的 id:
function textKeyDown(e) {
if (e.keyCode == 13) {
var myBtn = $get(myButtonId);
myBtn.click();
}
}
您可能会认为上面的操作可以正常工作,但事实证明,强制单击向导按钮会造成极其隐秘的冲突 - 页面上的第一个按钮也会单击,覆盖我通过脚本强制单击的初始按钮和产生非常奇怪的结果。在我的例子中,我的母版页中的第一个按钮是一个显示主页的按钮,当用户单击它时,他们会返回到他们的主页。因此,在我试图强制点击向导的“下一步”按钮时,我最终会回到我的主页,这看起来完全没有理由。在附加到 PageRequestManager.initializeRequest 之后,我可以看到我有两个单独的回发启动:1 个用于我的强制向导按钮单击,1 个用于当时甚至不在我的雷达上的按钮 - 主页按钮。
所以,长话短说,如果我从后面的代码中更新表单的默认按钮(Page.Form.DefaultButton),然后从后面的代码中发出这个脚本并从我的文本框中引用它,一切都很好:
public static void ExampleAssignDefaultButton(WizardStepBase activeWizardStep, TextBox myTextBox, IButtonControl myButton)
{
// create the format string for the script
string javaScript = @"function defaultButton(src, evt){{
if(evt.keyCode == 13){{
var btn = $get('{0}');
setTimeout(new function() {{ btn.click(); }}, 5);
}}
}}";
// format it ...
javaScript = String.Format(javaScript, ((WebControl)myButton).ClientID);
// register it...
ScriptManager.RegisterClientScriptBlock(activeWizardStep, activeWizardStep.GetType(), "defaultButton", javaScript, true);
// assign it to my textbox
myTextBox.Attributes.Add("onkeydown", "defaultButton(this, event);");
// also update the form's default button:
myTextBox.Page.Form.DefaultButton = ((WebControl)myButton).UniqueID;
}
值得注意的是,我总是从活动向导步骤的 OnPreRender 事件中调用上述方法。还值得注意的是,因为我的向导中的每个步骤只有一个文本框,所以我只需将此行为分配给单个控件。我没有尝试过这个修复范围来捕捉整个页面上的 Enter 键按下,尽管我无法想象它在这种情况下的行为会有太大的不同。如果每个步骤有很多输入,您可能不需要在向导中的每个控件上按 Enter 键。
所以,你有它 - 只需 12 小时的故障排除即可完成本应花费大约 10 分钟的事情。
快乐编码。
乙