wake-up-neo.com

Ein Klick auf Onclick wird abgebrochen, wenn OnclientClick falsch ist?

Ist es möglich, die onclientclick-Eigenschaft einer Schaltfläche zu verwenden, um eine clientseitige Prüfung durchzuführen. Wenn die Prüfung true zurückgibt, lösen Sie das Ereignis onclick aus. Wenn die clientseitige Prüfung false zurückgibt, lösen Sie das onclick-Ereignis nicht aus.

Ist das möglich?

UPDATE:

Diese 2 arbeiten:

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

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

Die nächsten 2 funktionieren nicht:

// 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();"

Es übermittelt das Formular beide Male.

Warum das?

24
oshirowanen

Sie möchten return in OnClientClick hinzufügen, nachdem eine Funktion aufgerufen wurde. Andernfalls wird die Schaltfläche zurückgesendet, auch wenn die Funktion false zurückgibt.

<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>
41
Win

Sicher. Wenn Sie return false in Ihrer OnClientClick verwenden, wird jegliche Navigation verhindert. Ihr Code würde also so aussehen:

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

Ja, Sie können im onclientClick-Funktionsaufruf preventDefault() verwenden.

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

}

ODER

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

}
2
Subin Jacob

Auf der Serverseite die Schaltfläche erstellen

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

// Enthält den Servercode

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

// Enthält den JS-Code für die Seite

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 ;
}
1
chri3g91

Ich bin auch auf dieses Problem gestoßen. Hatte nicht gerne auf jeden Linkbutton das OnClientClick = return false gesetzt. Mit einer einfachen Seite ist es einfacher, einen Anker zu verwenden und zu vermeiden, dass Sie den href füllen müssen.

Dies ist jedoch nicht immer möglich. Eine einfache Schlussfolgerung besteht also darin, den LinkButton zu erben und eine Variable wie AutoPostBack hinzuzufügen. Wenn false, überschreiben Sie einfach die Ausgabe mit dem HTML-Code oder fügen Sie den OnClientClick hinzu. Ich mag Inline-Tags nicht wirklich.

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

Viele Attribute sollten in einem ViewState behandelt werden, aber in diesem Fall denke ich, dass wir gut sind;

1
Mike