23 Stimmen

Login-Kontrollschaltfläche abschicken, wenn ich Enter drücke

Ich habe eine ASP.NET-Webseite mit einem Login-Steuerelement darauf. Wenn ich die Eingabetaste drücke, wird die Anmeldeschaltfläche nicht ausgelöst; stattdessen wird die Seite abgeschickt und tut nichts.

Die Standardlösung für dieses Problem, die ich online gefunden habe, besteht darin, das Login-Steuerelement in ein Panel einzuschließen und dann die Standardschaltfläche des Panels festzulegen. Aber offenbar 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 erhalte ich:

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

Ich bin sicher, es gibt eine Möglichkeit, dies mit JavaScript zu tun, aber ich würde wirklich gerne es mit einfachen alten C#-Code zu tun, wenn möglich. Ist es möglich?

2voto

David Eison Punkte 1357

Angenommen, Login1 ist die ID Ihres Login-Controls.

Für "Enter" irgendwo auf der Seite zu übermitteln, fügen Sie init in Ihrem Codebehind:

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

Für 'enter', um nur zu senden, wenn innerhalb der Login-Steuerung, wrap die Login-Steuerung in einem asp:Panel und setzen DefaultButton="Login1$LoginButton" auf dem Podium

Beide Ansätze funktionieren gut mit Musterseiten.

1voto

Kb. Punkte 6960

Basierend auf Ihren guten Antworten habe ich ein benutzerdefiniertes Steuerelement erstellt, das
ermöglicht es einer Seite, mehrere Standardschaltflächen zu haben, je nachdem, welcher Bereich im Fokus ist.
Sie überschreibt die OnLoad-Methode von Panel und die Eigenschaft DefaultButton.

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);
    }

    /// <summary>
    /// 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".
    /// </summary>
    /// <param name="panel"></param>
    /// <param name="button"></param>
    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;
        }
    }      
}

1voto

samuel Punkte 11

Eine Lösung besteht darin, das Login-Steuerelement in das Panel-Steuerelement einzubetten und die defaultbutton der Platte zum Parent$ID der Schaltfläche in der Login-Steuerung funktioniert. Hier ist der Code:

<asp:Panel id="panel1" runat="server" DefaultButton="Login1$LoginButton">
<asp:Login ID="Login1" runat="server" BackColor="#F7F6F3">
<LayoutTemplate>
<table>
...
<tr>
<td><asp:Button ID="LoginButton" runat="server" /></td>
</tr>
</table>
</LayoutTemplate>
</asp:Login>
</asp:Panel>

1voto

Jason Marsell Punkte 1632

Um die obigen Beiträge um weitere Details und Anleitungen zu ergänzen, finden Sie hier eine Kurzanleitung:

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

Zunächst müssen Sie im Formular-Tag der Seite die Standardschaltfläche festlegen. Unten sehen Sie, wie ich auf den Namen gekommen bin.

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

(Namensgebung: Der ucLogin-Teil vor dem Dollarzeichen muss die ID Ihres Login-Steuerelements sein, wie weiter unten auf Ihrer Seite angegeben. Der btnSubmit-Teil muss die ID der Schaltfläche sein, wie sie in der html-Datei des Login-Steuerelements benannt ist.)

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

<!-- Login Control - use a panel so we can set the default button -->
<asp:Panel runat="server" ID="loginControlPanel" DefaultButton="ucLogin$btnSubmit">                         
     <uc:Login runat="server" ID="ucLogin"/>                                                    
</asp:Panel>

Das sollte für Sie reichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X