После дня или двух, потянув за волосы, мне удалось это взломать ... надеюсь, это поможет другим таким же разочарованным, как и я:
Любой, кто нашел этот пост, знает, что интуитивный ответ здесь, установив для кнопки по умолчанию формы кнопку «Далее» вашего Мастера, ничего не делает. Итак, следующий логический шаг - попытаться обойти проблему, нажав кнопку от имени пользователя. Предположим, что я прикрепил описанный ниже обработчик к своему текстовому полю изнутри codebehind и что myButtonId - это идентификатор кнопки, которая мне нужна по умолчанию:
function textKeyDown(e) {
if (e.keyCode == 13) {
var myBtn = $get(myButtonId);
myBtn.click();
}
}
Вы могли бы подумать, что вышеприведенное будет работать просто отлично, но, как оказалось, принудительное нажатие кнопки Wizard вызывало чрезвычайно скрытый конфликт - первая кнопка на странице также будет щелкать, переопределяя исходное нажатие кнопки, которое я принудительно нажал. с помощью сценария и создания очень странных результатов. В моем случае первая кнопка на моей главной странице - это кнопка «Home», и когда пользователь нажимает на нее, он возвращается на свою домашнюю страницу. Поэтому, пытаясь заставить нажать кнопку «Далее» мастера, я снова оказался на своей домашней странице, что было совершенно бессмысленно. После присоединения к 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 минут.
Удачного кодирования.
B