2013-10-02 8 views
21

Czy możliwe jest użycie właściwości przycisku onclientclick do sprawdzania klienta. Jeśli kontrola zwróci true, należy zwolnić zdarzenie onclick. Jeśli czek od klienta zwraca false, nie wywołuj zdarzenia onclick.Zatrzymanie onclick z wypalania, gdy onclientclick jest false?

Czy to możliwe?

UPDATE:

Są 2 praca:

Stops the form from submitting: 
OnClientClick="return false;" 

Allows the form to submit: 
OnClientClick="return true;" 

Następnego 2 nie działają:

// in js script tag 
function mycheck() { 
    return false; 
} 

// in asp:button tag 
OnClientClick="return mycheck();" 

// in js script tag 
function mycheck() { 
    return true; 
} 

// in asp:button tag 
OnClientClick="return mycheck();" 

Twierdzi postaci zarówno razy.

Dlaczego tak jest?

+0

proszę zobacz aktualizację do pytania z tym, co próbowałem. – oshirowanen

Odpowiedz

36

Chcesz dodać return wewnątrz OnClientClick po funkcją jest tzw. W przeciwnym razie przycisk zostanie wysłany z powrotem, nawet jeśli funkcja zwróci wartość false.

<asp:button ID="Button1" runat="server" OnClick="Button1_Click" 
    OnClientClick="return checkValidation()" Text="Submit" /> 

<script type="text/javascript"> 
    function checkValidation() { 
     return confirm('Everything ok?'); 
    } 
</script> 
+0

Proszę zobaczyć aktualizację, aby zakwestionować to, co próbowałem. – oshirowanen

+0

Zaktualizowany kod działa. Możesz go przetestować, tworząc nowy aspx (bez strony wzorcowej). Może to mieć związek z istniejącym kodem javascript, który zakłóca działanie funkcji mycheck. – Win

+0

Dzięki człowieku .. Uratowałeś mi czas .. –

1

Tak można, W OnClientClick użycia wywołania funkcji preventDefault()

function onclientClickFun(e) 
{ 
    if(!IsValidationSuccess) 
{ 
    e.preventDefault(); 
} 

} 

LUB

function onclientClickFun(e) 
{ 
    if(!IsValidationSuccess) 
{ 
    return false; 
} 

} 
+0

Proszę zobaczyć aktualizację, aby odpowiedzieć na pytanie, co próbowałem. – oshirowanen

7

Jasne. Jeśli użyjesz return false w swoim OnClientClick, uniemożliwi to nawigację. Więc jesteś kod wyglądałby następująco:

<asp:LinkButton runat="server" OnClientClick="if(!ValidatePage()) { return false;}" /> 
+0

Proszę zobaczyć aktualizację, aby zakwestionować to, co próbowałem. – oshirowanen

+0

@oshirowanen Szczerze mówiąc, nie pamiętam dokładnie, dlaczego jawnie, dlaczego musisz umieścić 'return false' w' OnClientClick'. Jeśli sobie przypominam, ma to związek z enkapsulacją ASP.NET dookoła twojego kodu w 'OnClientClick' kiedy renderuje rzeczywisty HTML i JavaScript. –

1

Natknąłem się również na tę kwestię. Nie podoba mi się, aby umieścić OnClientClick = return false na każdym łączu. Prostą stroną jest po prostu łatwiej użyć kotwicy i uniknąć bąka wypełniającego go.

Jednak nie zawsze jest to możliwe. Tak więc prosty wniosek jest po prostu odziedziczyć LinkButton i dodać zmienną taką jak AutoPostBack. jeśli false, po prostu nadpisuj dane wyjściowe za pomocą html lub dodaj OnClientClick. Nie lubię tagów wbudowanych.

namespace My.WebControls { 
    [ToolboxData("<{0}:LinkButton runat=server ID=btn></{0}:LinkButton>"), ParseChildren(true), ToolboxItem(true)] 
    public class LinkButton : System.Web.UI.WebControls.LinkButton { 

     private bool _postback = true; 
     [Bindable(true), Category("Behavior"), DefaultValue(true), Description("Gets or Sets the postback click behavior")] 
     public bool AutoPostBack { get { return _postback; } set { _postback = value; } } 


     protected override void Render(System.Web.UI.HtmlTextWriter writer) { 
      if(!AutoPostBack){ 
       this.OnClientClick = "return false"; 
      } 
      base.Render(writer); 
     } 
    } 
} 

Wiele atrybutów powinno być obsługiwanych w ViewState, ale w tym przypadku myślę, że jesteśmy dobrzy;

1

Na stronie serwera utworzyć przycisk:

var button1 = new Button(); 
button1.ServerClick += new EventHandler(button1_ServerClick); 
button1.OnClientClick = SetJsForSaveBtn(); 
button1.Attributes.Add("UseSubmitBehavior", "false"); 
panel.Controls.Add(button1); 

// Zawiera kod serwera

private void saveBtn_ServerClick(object sender, EventArgs e) 
{ 
    //do something if ClientClick returns true 
} 

// Zawiera kod JS dla strony

LiteralControl js = new LiteralControl(); 
panel.Controls.Add(js); 
js.Text [email protected]"<script type='text/javascript'> 
$(document).ready(function(){ 
function CheckValidationOnClient(){ 
    if(!ValidatePage()){ 
    return false; 
    } 
    else{ 
    return true; 
    } 
}; 
}); 
</script> "; 

private string SetJsForSaveBtn() 
{ 
    var jsfunc = @" return CheckValidationOnClient()"; 
    return jsfunc ; 
} 
Powiązane problemy