2008-10-14 19 views
22

Mam stronę internetową ASP.NET z kontrolką logowania. Po naciśnięciu klawisza Enter przycisk logowania nie uruchamia się; zamiast tego strona przesyła, nie robiąc nic.Prześlij przycisk logowania do logowania po naciśnięciu Enter

Standardowym rozwiązaniem tego, które znalazłem w Internecie, jest zamknięcie kontrolki logowania w panelu, a następnie ustawienie domyślnego przycisku panelu. Ale najwyraźniej to nie działa tak dobrze, jeśli strona ma stronę wzorcową. Próbowałem ustawienie domyślnego przycisku w kodzie z kontroli .ID, sterowania .ClientID i kontroli .UniqueID, aw każdym przypadku uzyskać:

defaultButton z panelName musi być Identyfikator kontroli typu IButtonControl.

Jestem pewien, że jest sposób, aby to zrobić z JavaScript, ale naprawdę chciałbym to zrobić z prostym starym C#, jeśli to możliwe. Czy to możliwe?

+0

Nie obawiaj się w tym przypadku javascript. Zaoszczędzi ci to wiele bólu głowy i czasu. – StingyJack

+0

Nie * boję się tego, ale to odstrasza mnie, że powinien istnieć sposób na zrobienie tego w kodzie i nie wiem, co to jest. –

Odpowiedz

33

ten powinien być pomocny: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx

można użyć następujących odwołać przycisk w szablonie sterowania logowanie:

DefaultButton="Login$LoginButton" 

Zasadniczo, można zdefiniować DefaultButton nie tylko na poziomie Form, ale także na poziomie pojedynczego panelu, o ile fokus znajduje się w panelu, domyślny przycisk panelu zostanie użyty po naciśnięciu "Enter".

+0

To działa, ale z jakiegoś powodu nie mogę tego zrobić w kodzie. Ani ID, ani ClientID, ani UniqueID nie dają prawidłowego formatu ID dla właściwości DefaultButton. –

+0

Próbowałeś czegoś takiego? ((LoginForm.FindControl ("LoginButton")) jako Button) .UniqueID –

+0

Tak, próbowałem, i to nie działało.FindControl faktycznie działa (mogłem go zobaczyć w debugerze), ale z jakiegoś powodu, DefaultButton wymaga specjalnego formatu ID. –

4

trzeba dodać coś takiego obciążenia strony ...

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

pole tekstowe hasło ma atrybut onkeypress dodał, że wymusi doPostBack przycisk przedstawienia, czy „Enter” jest wciśnięty. Symuluje to kliknięcie przycisku przesyłania.

+0

Tak właśnie to robię. –

2

Wygląda na to, że przycisk logowania jest wypluwany jako <input type="button"> zamiast <input type="submit">. Zawsze możesz ustawić LoginControl i dodać przycisk wysyłania, pozbywając się ohydnego domyślnego znacznika w tym samym czasie!

Jeśli musisz poprawić obsługę JavaScript, coś jest nie tak! (Ale to brzmi jak wiesz to)

+0

Jak na ironię przycisk logowania jest już szablonem. –

+0

Następnie dodanie polecenia = "Zaloguj się" powinno wystarczyć? – roryf

+0

Aby wyjaśnić - dodaj ten atrybut do twojego asp: Button control, który jest przyciskiem logowania – roryf

8

Świetna odpowiedź: Blend Master! Zasadniczo po prostu użyj Panel.DefaultButton, ale chcę wyjaśnić zamieszanie na temat tego, co dokładnie trzeba ustawić. To nie tylko ".ID" czy ".UniqueID" - brakuje w tym dokumentacji.

Należy ustawić na unikatowy identyfikator przycisku, w stosunku do kontenera nazw unikatowych panelu. Na przykład, jeśli Twój unikalny identyfikator panelu to "Treść $ Treść $ pnlLogin", a identyfikator unikalnego identyfikatora przycisku logowania to "Treść $ Treść $ ucLogin $ btnLogin" (ponieważ znajduje się on w kontrolce o nazwie "ucLogin"), to musisz ustawić Panel.DefaultButton na "ucLogin $ btnLogin".

Możesz to wykonać w kodzie w następujący sposób. (Nie mogłem znaleźć w tym celu żadnej metody biblioteki klas, ale daj mi znać, jeśli ją znajdziesz.)

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; 
} 
+0

Odpowiedź evgeny'ego zadziałała dla mnie, prawie tak samo jak mieszanka mistrza, ale z dolara wliczony znak –

1

podstawie twoich dobrych odpowiedzi, wykonane formant niestandardowy, który
umożliwia stronę, aby mieć kilka domyślnych przycisków na podstawie której panelu, który jest w centrum uwagi.
Zastępuje on metodę Panel OnLoad i właściwość 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; 
     } 
    }  
} 
2

Yo, znalazłem to rozwiązanie w sieci, działało dla mnie.

<asp:Panel ID="panelLogin" runat="server" DefaultButton="Login1$LoginButton"> 
<asp:Login ID="Login1" runat="server" > 
<LayoutTemplate> 
... 
<asp:Button ID="LoginButton" .../> 
</LayoutTemplate> 
</asp:Login> 
</asp:Panel> 
2

Założenie Login1 jest identyfikatorem kontroli logowania.

Dla „enter” w dowolnym miejscu na stronie, aby złożyć, dodać init w kodzie:

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

dla „wejść” to tylko przedstawić, gdy wewnątrz kontroli logowania, owinąć kontrolę logowania w asp: Panel i zestaw DefaultButton="Login1$LoginButton" na panelu

Oba podejścia działają dobrze na stronach wzorcowych.

1

Rozwiązanie jest dostarczane przez osadzenie kontrolki logowania w panelu sterowania i ustawienie defaultbutton panelu na Parent$ID przycisku wewnątrz kontroli logowania działa. Jest kod:

<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> 
+0

To jest szybki sposób, działa! –

1

Aby dodać nieco więcej szczegółów i instrukcje do powyższych stanowiskach, oto solucja:

W znacznikach jakichkolwiek stron, które załadować kontrolę logowania, trzeba aktualizować html w dwóch miejscach.

Najpierw w tagu formularza strony należy ustawić domyślny przycisk. Zobacz poniżej, jak wymyśliłem nazwę.

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

(Naming: The ucLogin część przed znakiem dolara musi mieć identyfikator kontrolą logowania, jak oświadczył dalej w dół w stronę Odpowiadający btnSubmit część musi mieć identyfikator przycisku jak to nazwał w. html kontrolki się zalogować za)

Następnie trzeba owinąć deklarację kontrolą logowania w panelu, i ustaw jego właściwość defaultButton, a także:

<!-- 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> 

to powinno zrobić to za Ciebie.

Powiązane problemy