Senden Sie die Login-Steuerschaltfläche, wenn ich die Eingabetaste drücke

Ich habe eine ASP.NET-Webseite mit einem Login-Steuerelement darauf. Wenn ich Enter drücke, wird die Login-Taste nicht ausgelöst. Stattdessen reicht die Seite ein, nichts zu tun.

Die Standardlösung, die ich online gefunden habe, besteht darin, das Login-Steuerelement in ein Panel einzufügen und dann die Standard-Panel-Schaltfläche zu setzen. Aber anscheinend funktioniert das nicht so gut, wenn die Seite eine Masterseite hat. Ich habe versucht, die Standardschaltfläche im Code mit Kontrolle .ID, Kontrolle .ClientID und Kontrolle .UniqueID, und in jedem Fall I bekommen:

Der DefaultButton von PanelName muss die ID eines Steuerelements vom Typ IButtonControl sein.

Ich bin mir sicher, dass es einen Weg gibt, dies mit JavaScript zu tun, aber ich würde es wirklich gerne mit normalem alten C# -Code machen, wenn möglich. Ist es möglich?

22
Ich fürchte es nicht, aber es macht mir klar, dass es einen Weg geben sollte, es im Code zu machen, und ich kann nicht herausfinden, was es ist.
hinzugefügt der Autor Ryan Lundy, Quelle
Fürchten Sie in diesem Fall nicht das Javascript. Es wird Ihnen viele Kopfschmerzen und Zeit ersparen.
hinzugefügt der Autor StingyJack, Quelle

9 Antworten

This should be helpful: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx

Mit den folgenden Möglichkeiten können Sie auf die Schaltfläche in der Login-Steuervorlage verweisen:

DefaultButton="Login$LoginButton"

Grundsätzlich können Sie einen DefaultButton nicht nur auf der Form-Ebene, sondern auch auf der individuellen Panel-Ebene definieren, solange der Fokus innerhalb des Panels liegt, wird die Standard-Schaltfläche für das Panel verwendet, wenn Sie "Enter" drücken

33
hinzugefügt
Ihre gespeicherten Millionen von Leben !!!
hinzugefügt der Autor Sarawut Positwinyu, Quelle
@MikeC. Ich möchte Sie nur wissen lassen, dass das für mich nützlich ist: D
hinzugefügt der Autor Sarawut Positwinyu, Quelle
Nur ein Hinweis für alle anderen, die einen ImageButton verwenden ... Sie müssen DefaultButton = "Login $ LoginImageButton" verwenden.
hinzugefügt der Autor Mike Cole, Quelle
Das funktioniert, aber aus irgendeinem Grund kann ich es nicht im Code tun. Weder ID noch ClientID noch UniqueID erzeugen das korrekte ID-Format für die DefaultButton-Eigenschaft des Panels.
hinzugefügt der Autor Ryan Lundy, Quelle
Ja, das habe ich probiert, und es hat nicht funktioniert. FindControl funktioniert tatsächlich (ich konnte es im Debugger sehen), aber aus irgendeinem Grund benötigt DefaultButton ein spezielles ID-Format.
hinzugefügt der Autor Ryan Lundy, Quelle
Hast du so etwas probiert? ((LoginForm.FindControl ("LoginButton")) als Schaltfläche) .UniqueID
hinzugefügt der Autor Vassili Altynikov, Quelle
Es stellt sich heraus, dass Sie einfach den gleichen Wert in Code-Behind verwenden müssen: pnlLogin.DefaultButton = "Login1LoginButton";
hinzugefügt der Autor Vassili Altynikov, Quelle
Ich habe den DefaultButton in den Panels komplett vergessen. Danke, dass du mich erinnert hast.
hinzugefügt der Autor Rismo, Quelle

Tolle Antwort von Blend Master ! Verwenden Sie im Wesentlichen nur Panel.DefaultButton, aber ich möchte die Verwirrung darüber aufklären, wo genau Sie es einrichten müssen. Es ist nicht nur ".ID" oder ".UniqueID" - die Dokumentation fehlt hier etwas.

Sie müssen es auf die EindeutigeID der Schaltfläche festlegen, relativ zu dem Namensbereichsbehälter UniqueID des Steuerfelds. Wenn Ihre Eindeutigkeits-ID beispielsweise "Body $ Content $ pnlLogin" lautet und die UniqueID Ihrer Anmeldeschaltfläche "Body $ Content $ ucLogin $ btnLogin" ist (weil sie sich in einem Steuerelement namens "ucLogin" befindet), müssen Sie Panel.DefaultButton auf festlegen "ucLogin $ btnAnmelden".

Sie können dies folgendermaßen im Code ausführen. (Ich konnte keine Klassenbibliotheksmethode dafür finden, aber lassen Sie mich wissen, wenn Sie eine finden.)

void SetDefaultButton(Panel panel, IButtonControl button)
{
    string uniqueId = ((Control)button).UniqueID;
    string panelIdPrefix = panel.NamingContainer.UniqueID + Page.IdSeparator;

    if (uniqueId.StartsWith(panelIdPrefix))
    {
        uniqueId = uniqueId.Substring(panelIdPrefix.Length);
    }

    panel.DefaultButton = uniqueId;
}
8
hinzugefügt
evgenys Antwort funktionierte für mich, fast genauso wie Blend Master, aber mit dem Dollarzeichen inklusive
hinzugefügt der Autor Marbella Consulting, Quelle

Sie müssen so etwas beim Seitenladen hinzufügen ...

txtPassword.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" + lnkSubmit.UniqueID + "','')")

Das Passwort-Textfeld hat ein onKeyPress-Attribut hinzugefügt, das ein doPostBack auf dem Senden-Button erzwingt, wenn die "Enter" -Taste gedrückt wird. Dies simuliert das Klicken auf den Absenden-Button.

4
hinzugefügt
Genau so mache ich es
hinzugefügt der Autor Andy Brudtkuhl, Quelle

Klingt so, als würde die Login-Schaltfläche als <input type = "button"> ausgespuckt anstatt als <input type = "submit"> . Sie könnten das LoginControl immer mit einem Template versehen und den Submit-Button hinzufügen, um das schreckliche Standard-Markup zur gleichen Zeit zu entfernen!

Wenn Sie Javascript verwenden müssen, um etwas zu beheben, ist ernsthaft falsch! (Aber dann klingt es so, als wüsstest du das)

2
hinzugefügt
Dann sollte Command = "Login" hinzufügen, sollte der Trick nein?
hinzugefügt der Autor roryf, Quelle
Um dies zu verdeutlichen - füge dieses Attribut deinem asp hinzu: Button-Steuerelement, das die Login-Schaltfläche ist
hinzugefügt der Autor roryf, Quelle
Ironischerweise ist der Login-Button bereits als Template angelegt.
hinzugefügt der Autor Ryan Lundy, Quelle

Yo, ich fand diese Lösung im Netz, es hat für mich funktioniert.

 
 
 
 ...
 
 
 
 
2
hinzugefügt

Angenommen, Login1 ist die ID Ihres Login-Steuerelements.

Um an einer beliebigen Stelle auf der Seite "Enter" einzugeben, fügen Sie in Ihrem Codebehind zu init hinzu:

protected void Page_Init(object sender, EventArgs e)
{
    this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}

Geben Sie das Login-Steuerelement in ein asp: -Panel ein und legen Sie es fest, um die Eingabe nur innerhalb des Login-Steuerelements zu übermitteln DefaultButton = "Login1 $ LoginButton" im Panel

Beide Ansätze funktionieren gut mit Masterseiten.

2
hinzugefügt

Based on your good answers, made a custom control that
enables a Page to have several default buttons based on which panel which is in focus.
It overrides Panel's OnLoad method and DefaultButton property.

public class DefaultButtonPanel:Panel
{
    protected override void OnLoad(EventArgs e)
    {
        if(!string.IsNullOrEmpty(DefaultButton))
        {
            LinkButton btn = FindControl(DefaultButton) as LinkButton;
            if(btn != null)
            {
                Button defaultButton = new Button {ID = DefaultButton.Replace(Page.IdSeparator.ToString(), "_") + "_Default", Text = " "};
                defaultButton.Style.Add("display", "none");
                PostBackOptions p = new PostBackOptions(btn, "", null, false, true, true, true, true, btn.ValidationGroup);
                defaultButton.OnClientClick = Page.ClientScript.GetPostBackEventReference(p) + "; return false;";
                Controls.Add(defaultButton);
                DefaultButton = defaultButton.ID;
            }
        }
        base.OnLoad(e);
    }

    /// 
/// Set the default button in a Panel. /// The UniqueID of the button, must be relative to the Panel's naming container UniqueID. /// /// For example: /// Panel UniqueID is "Body$Content$pnlLogin" /// Button's UniqueID is "Body$Content$ucLogin$btnLogin" /// (because it's inside a control called "ucLogin") /// Set Panel.DefaultButton to "ucLogin$btnLogin". ///
 
    /// 
    /// 
    public override string DefaultButton
    {
        get
        {
            return base.DefaultButton;
        }

        set
        {
            string uniqueId = value;
            string panelIdPrefix = this.NamingContainer.UniqueID + Page.IdSeparator;
            if (uniqueId.StartsWith(panelIdPrefix))
            {
                uniqueId = uniqueId.Substring(panelIdPrefix.Length);
            }
            base.DefaultButton = uniqueId;
        }
    }      
}
1
hinzugefügt

Eine Lösung besteht darin, das Login-Steuerelement in das Panel-Steuerelement einzubetten und die defaultbutton des Panels auf die Parent $ ID der Schaltfläche innerhalb der Login-Steuerung zu setzen. Da ist der Code:




<table>
...
<tr>
<td></td>
</tr>
</table>



1
hinzugefügt
Das ist der schnelle Weg, es funktioniert !!
hinzugefügt der Autor Emanuel Pirovano, Quelle

Um den obigen Beiträgen etwas mehr Details und Anweisungen hinzuzufügen, hier eine Anleitung:

Im Markup von Seiten, die Ihr Login-Steuerelement laden, müssen Sie das HTML an zwei Stellen aktualisieren.

Zuerst müssen Sie im Formular-Tag der Seite die Standardschaltfläche festlegen. Siehe unten, wie ich auf den Namen gekommen bin.

<form id="form1" runat="server" defaultbutton="ucLogin$btnSubmit">

(Benennung: Der ucLogin-Teil vor dem Dollarzeichen muss die ID Ihres Login-Steuerelements sein, wie weiter unten auf Ihrer Seite erklärt. Der btnSubmit-Teil muss die ID der Schaltfläche sein, wie sie im HTML des Login-Steuerelements genannt wird)

Als Nächstes müssen Sie die Deklaration Ihres Login-Steuerelements in ein Panel einfügen und auch dessen DefaultButton-Eigenschaft festlegen:

<!-- Login Control - use a panel so we can set the default button -->
                         
                                                         

Das sollte es für dich tun.

1
hinzugefügt