Nach ein oder zwei Tagen, in denen ich mir die Haare raufte, gelang es mir, dies zu knacken... ich hoffe, das hilft anderen, die genauso frustriert waren wie ich:
Jeder, der diesen Beitrag gefunden hat, weiß, dass die intuitive Antwort, die Standardschaltfläche des Formulars auf die Schaltfläche "Weiter" Ihres Assistenten zu setzen, nichts bewirkt. Der nächste logische Schritt ist also zu versuchen, das Problem zu umgehen, indem man die Schaltfläche im Namen des Benutzers anklickt. Nehmen wir an, dass ich den untenstehenden Handler an mein Textfeld aus dem Codebehind angehängt habe und dass myButtonId die ID der Schaltfläche ist, die ich als Standard benötige:
function textKeyDown(e) {
if (e.keyCode == 13) {
var myBtn = $get(myButtonId);
myBtn.click();
}
}
Man könnte meinen, dass das oben beschriebene gut funktionieren würde, aber es stellte sich heraus, dass das Erzwingen eines Klicks auf die Schaltfläche des Assistenten einen äußerst heimtückischen Konflikt verursachte - die erste Schaltfläche auf der Seite würde ebenfalls klicken, wodurch der von mir per Skript erzwungene Klick auf die erste Schaltfläche überschrieben würde und sehr seltsame Ergebnisse erzielt würden. In meinem Fall ist die erste Schaltfläche auf meiner Musterseite eine Schaltfläche mit der Aufschrift "Startseite", und wenn der Benutzer darauf klickt, kehrt er zu seiner Startseite zurück. Wenn ich also versuchte, die Schaltfläche "Weiter" des Assistenten zum Klicken zu zwingen, landete ich ohne ersichtlichen Grund direkt auf meiner Homepage. Nach dem Anhängen an PageRequestManager.initializeRequest konnte ich sehen, dass ich zwei getrennte Postbacks initiiert hatte: 1 für meine gezwungenen Assistenten Schaltfläche klicken, und 1 für eine Schaltfläche, die nicht einmal auf meinem Radar zu der Zeit war - die Startseite Schaltfläche.
Also, lange Geschichte kurz, wenn ich das Formular Standard-Schaltfläche (Page.Form.DefaultButton) aus dem Code hinter aktualisieren, dann emittieren Sie dieses Skript aus dem Code hinter und verweisen Sie es von meinem Textfeld sowie, alles funktioniert ganz gut:
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;
}
Es ist erwähnenswert, dass ich die obige Methode immer über das OnPreRender-Ereignis des aktiven Assistentenschritts aufrufe. Es ist auch erwähnenswert, dass ich, da ich nur ein Textfeld pro Schritt in meinem Assistenten habe, dieses Verhalten nur einem einzigen Steuerelement zuweisen musste. Ich habe nicht versucht, diese Korrektur auf das Drücken der Eingabetaste auf der gesamten Seite zu übertragen, obwohl ich mir nicht vorstellen kann, dass es sich in diesem Kontext anders verhalten würde. Wenn Sie viele Eingaben pro Schritt haben, müssen Sie die Eingabetaste wahrscheinlich nicht bei jedem Steuerelement in Ihrem Assistenten abfangen.
Da haben Sie es also - nur 12 Stunden Fehlersuche für etwas, das eigentlich nur 10 Minuten dauern sollte.
Viel Spaß beim Kodieren.
B