asp.net - aspx - ¿Dejar de onclick de disparar cuando onclientclick es falso?
onclientclick aspx (5)
Desea agregar return
dentro de OnClientClick después de que se invoca una función. De lo contrario, el botón publicará nuevamente incluso si la función devuelve falso.
<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>
¿Es posible usar la propiedad onclientclick
de un botón para hacer una verificación del onclientclick
del onclientclick
? Si la verificación devuelve true
, active el evento onclick
. Si la verificación del lado del cliente devuelve false
, no active el evento onclick
.
¿Es eso posible?
ACTUALIZAR:
Estos 2 trabajos:
Stops the form from submitting:
OnClientClick="return false;"
Allows the form to submit:
OnClientClick="return true;"
Los siguientes 2 no funcionan:
// 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();"
Envía el formulario las dos veces.
¿Porqué es eso?
Me encontré con este problema también. No me gustó tener que poner OnClientClick = return false en cada botón de enlace. Con una página simple, es más fácil usar un anclaje y evitar que asp llene el href por ti.
Sin embargo, esto no siempre es posible. Entonces, una conclusión simple es simplemente heredar el LinkButton y agregar una variable como AutoPostBack. si es falso, simplemente anule el resultado con el html o agregue el OnClientClick. Realmente no me gustan las etiquetas en línea.
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);
}
}
}
Muchos atributos deberían ser manejados en un ViewState, pero en este caso creo que estamos bien;
Por supuesto. Si usa return false
dentro de su OnClientClick
que ocurra ninguna navegación. Entonces tu código sería como:
<asp:LinkButton runat="server" OnClientClick="if(!ValidatePage()) { return false;}" />
Sí, puedes, en la llamada a la función onClientClick usa preventDefault()
function onclientClickFun(e)
{
if(!IsValidationSuccess)
{
e.preventDefault();
}
}
O
function onclientClickFun(e)
{
if(!IsValidationSuccess)
{
return false;
}
}
En la página del servidor crea el botón :
var button1 = new Button();
button1.ServerClick += new EventHandler(button1_ServerClick);
button1.OnClientClick = SetJsForSaveBtn();
button1.Attributes.Add("UseSubmitBehavior", "false");
panel.Controls.Add(button1 );
// Contiene el código del servidor
private void saveBtn_ServerClick(object sender, EventArgs e)
{
//do something if ClientClick returns true
}
// Contiene el código JS para la página
LiteralControl js = new LiteralControl();
panel.Controls.Add(js);
js.Text =@"<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 ;
}