Trimiteți butonul de control al conectării când apăs pe Enter

Am o pagină web ASP.NET cu un control de conectare pe ea. Când am apăsat pe Enter, butonul de conectare nu se declanșează; în schimb, pagina prezintă, fără a face nimic.

Soluția standard pe care am găsit-o online este să închidem controlul de conectare într-un panou, apoi să setăm butonul implicit al panoului. Dar se pare că nu funcționează atât de bine dacă pagina are o pagină principală. Am încercat să configurez codul cu control .ID, control .ClientID și control .UniqueID și, în fiecare caz, obține:

DefaultButton din panelName trebuie să fie ID-ul unui control de tip IButtonControl.

Sunt sigur că există o modalitate de a face acest lucru cu JavaScript, dar aș vrea cu adevărat să o fac cu codul simplu C# vechi, dacă este posibil. Este posibil?

22
Eu nu mă tem , dar mi se spune că ar trebui să existe o modalitate de a face acest lucru în cod și nu pot să-mi dau seama ce este.
adăugat autor Ryan Lundy, sursa
Nu te teme de JavaScript în acest caz. Aceasta vă va salva multă durere de cap și timp.
adăugat autor StingyJack, sursa

9 răspunsuri

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

Puteți folosi următoarele pentru a face referire la butonul din cadrul șablonului de control al conectării:

DefaultButton="Login$LoginButton"

Practic, puteți defini un DefaultButton nu numai la nivelul Formularului, dar și la nivel de panou individual, atâta timp cât focalizarea se află în interiorul panoului, butonul implicit pentru panou va fi utilizat dacă apăsați pe "Enter"

33
adăugat
Salvatorul vostru milion de viata!
adăugat autor Sarawut Positwinyu, sursa
@MikeC. Vreau doar să vă spun că este util pentru mine: D
adăugat autor Sarawut Positwinyu, sursa
Doar un FYI pentru oricine altcineva care utilizează un ImageButton ... va trebui să utilizați DefaultButton = "Login LoginImageButton".
adăugat autor Mike Cole, sursa
Asta funcționează, dar din anumite motive nu pot să o fac în cod. Nici ID-ul, nici ClientID, nici UniqueID nu produc formatul corect de identitate pentru proprietatea DefaultButton a panoului.
adăugat autor Ryan Lundy, sursa
Da, a încercat asta și nu a funcționat. FindControl funcționează (am putut vedea în depanator), dar din anumite motive, DefaultButton necesită un format special de identificare.
adăugat autor Ryan Lundy, sursa
Ai încercat ceva de genul asta? ((LoginForm.FindControl ("LoginButton")) ca buton) .UniqueID
adăugat autor Vassili Altynikov, sursa
Se pare că pur și simplu trebuie să utilizați aceeași valoare în cod-behind: pnlLogin.DefaultButton = "Login1LoginButton";
adăugat autor Vassili Altynikov, sursa
Am uitat complet de DefaultButton pe panouri. Mulțumesc că mi-ai amintit.
adăugat autor Rismo, sursa

Răspuns bun de la Master Blend ! În esență, folosiți doar Panel.DefaultButton, dar vreau să clarific confuzia cu privire la exact ce trebuie să setați. Nu este doar ".ID" sau ".UniqueID" - documentația este puțin lipsită de acest lucru.

Trebuie să-l setați la adresa unică a butonului, relativ la containerul de numire al panoului UniqueID. De exemplu, dacă panoul dvs. UniqueID este "Body $ Content $ pnlLogin" și butonul de identificare a butonului dvs. de autentificare este "Body $ Content $ ucLogin $ btnLogin" (pentru că se află într-un control numit "ucLogin"), atunci trebuie să setați Panel.DefaultButton "ucLogin $ btnLogin".

Puteți face acest lucru în cod, după cum urmează. (Nu am putut găsi nici o metodă de bibliotecă de clasă pentru acest lucru, dar spune-mi dacă găsiți una.)

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
adăugat
răspunsul evanghelic a lucrat pentru mine, aproape la fel ca și maestrul de amestec, dar cu semnul dolarului inclus
adăugat autor Marbella Consulting, sursa

trebuie să adăugați ceva de genul ăsta în încărcarea paginii ...

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

caseta de text a parolei are un atribut onKeyPress adăugat care va forța un doPostBack pe butonul de trimitere dacă tasta "Enter" este apăsată. Acest lucru simulează dând clic pe butonul de trimitere.

4
adăugat
Acesta este exact modul în care o fac
adăugat autor Andy Brudtkuhl, sursa

Se pare că butonul de conectare este scos ca <input type = "button"> mai degrabă decât <input type = "submit"> . Ați putea întotdeauna să șablonați LoginControl și să adăugați butonul de trimitere, eliminând în același timp marcajul implicit hideous!

Dacă trebuie să utilizați Javascript pentru a repara acest lucru este grav greșit! (dar apoi se pare că știi asta)

2
adăugat
Apoi adăugarea comenzii = "Login" ar trebui să facă truc nu?
adăugat autor roryf, sursa
Pentru a clarifica - adăugați acel atribut la asp: butonul de control, care este butonul de conectare
adăugat autor roryf, sursa
În mod ironic, butonul de conectare este deja șablonat.
adăugat autor Ryan Lundy, sursa

Am găsit această soluție pe net, a lucrat pentru mine.

 
 
 
 ...
 
 
 
 
2
adăugat

Presupunând că Login1 este ID-ul controlului dvs. de conectare.

Pentru a "introduce" oriunde pe pagina pentru a trimite, adăugați la init în codebehind:

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

Pentru ca "introduceți" să trimiteți numai în interiorul controlului de autentificare, înfășurați controlul de conectare într-un asp: Panou și setați DefaultButton = "Login1 $ LoginButton" de pe panou

Ambele abordări funcționează bine cu paginile master.

2
adăugat

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
adăugat

O soluție este oferită prin încorporarea controlului de autentificare în interiorul comenzii panoului și setarea butonului implicit al panoului la codul Parent $ ID al butonului din controlul de conectare. Exista codul:




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



1
adăugat
Aceasta este calea rapidă, funcționează!
adăugat autor Emanuel Pirovano, sursa

Pentru a adăuga un pic mai multe detalii și instrucțiuni la postările de mai sus, iată un exemplu:

În marcarea tuturor paginilor care vă încarcă controlul de autentificare, trebuie să actualizați html-ul în două locuri.

Mai întâi, în eticheta formularului paginii, trebuie să setați butonul implicit. Vedeți mai jos cum am găsit numele.

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

(Denumire: Partea ucLogin înainte de semnul dolarului trebuie să fie ID-ul controlului dvs. de autentificare, așa cum este declarat mai jos în pagina dvs. Partea btnSubmit trebuie să fie ID-ul butonului așa cum este numit în html-ul de control al login-ului)

Apoi, trebuie să înfășurați declarația de control de conectare într-un panou și să setați proprietatea DefaultButton, de asemenea:

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

Ar trebui să facă asta pentru tine.

1
adăugat