2011-05-18 21 views
6

tengo un Create-Vista así ...Cómo deshabilitar la validación en una acción HttpPost en ASP.NET MVC 3?

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
     type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
     type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(null, new { @class = "validation" }) 
    ... 
    <input class="cancel" type="submit" value="OK" /> 
    ... 
    <input name="submit" type="submit" value="Save" /> 
} 

... y una correspondiente acción del controlador:

[HttpPost] 
public ActionResult Create(string submit, MyViewModel myViewModel) 
{ 
    if (submit != null) // true, if "Save" button has been clicked 
    { 
     if (ModelState.IsValid) 
     { 
      // save model data 
      return RedirectToAction("Index"); 
     } 
    } 
    else // if "OK" button has been clicked 
    { 
     // Disable somehow validation here so that 
     // no validation errors are displayed in ValidationSummary 
    } 

    // prepare some data in myViewModel ... 

    return View(myViewModel); // ... and display page again 
} 

He descubierto que puedo deshabilitar la validación del lado del cliente mediante el establecimiento de class="cancel" en el botón "Aceptar". Esto funciona bien

Sin embargo, la validación del lado del servidor todavía ocurre. ¿Hay alguna manera de desactivarlo en una acción de controlador (ver el bloque else en la acción Crear anterior)?

¡Gracias por la ayuda!

Respuesta

7

Recientemente tuve un problema similar. Quería excluir algunas propiedades de validación y utilizado el siguiente código:

ModelState.Remove("Propertyname"); 

Para ocultar los ErrorMessages puede utilizar

ModelState.Clear(); 

Pero la pregunta es por eso que envíe los valores si no se utilicen ? ¿No sería mejor utilizar un botón de reinicio para restablecer los valores en el siguiente formato:

<input type="reset" value="Reset Form"> 
2

La validación del lado del servidor debe estar en su clase MyViewModel. ¿Puedes usar una clase diferente que no implemente la validación? Las anotaciones de datos en ViewModel son responsables de establecer ModelState.IsValid en falso.

+0

Es la misma vista fuertemente tipada, por lo que creo que no puedo usar otro ViewModel. – Slauma

+0

@Slauma eso no es todo el caso. Tiene una vista individual, que usa el Modelo X que probablemente tiene todos sus atributos de validación. Puede crear el Modelo Y en el que copie y pegue el Modelo X y elimine todos los atributos de validación. En este punto, necesita tener 2 acciones de publicación de formulario separadas. Entonces crea (X) y TempSave (Y). Al final de TempSave (Y), o bien desearía redirigir a la acción original (si puede cargar los datos de guardado temporal) o tendría que devolver View (X), que puede hacer fácilmente que Y sea una X mediante el uso de mapeo de frameworks como ValueInjecter. –

+0

Podría enlazar javascript al botón de envío que cambiaría el destino del formulario de TempWave a Create. –

1

Ahora, acabo de tener esta idea:

... 
else // if "OK" button has been clicked 
{ 
    ModelState.Clear(); 
} 
... 

hecho que no reciben los mensajes en ValidationSummary más. ¿Tiene esto algún inconveniente o efecto secundario indeseable? Al menos no puedo ver un problema en este momento ...

+0

Acabo de escribir que deberías probar eso. No creo que tenga ningún inconveniente si está seguro de que no desea mostrar esos errores. No estoy seguro de por qué no desea mostrar los errores si hacen clic en el botón Enviar y no se ha ingresado nada. – chobo2

+0

@ chobo2: Lol, sí, ahora hay muchas respuestas que sugieren borrar el estado del modelo, así que siento seguro que no está completamente mal. Hay una diferencia entre el botón "Aceptar" y el botón "Guardar". Solo el botón "Guardar" escribe en DB y, por lo tanto, necesita validación. El botón "Aceptar" no escribe en DB. Solo obtiene algunos datos adicionales en ViewModel y vuelve a mostrar la vista. No quiero validación en este punto. Es una especie de lógica de lista desplegable dependiente: Seleccione la entrada en el primer menú desplegable, haga clic en "Aceptar", complete la segunda lista desplegable según la selección en el primer menú desplegable. – Slauma

+0

Ah, pensé que simplemente no quería mostrar la validación a las personas que hicieron clic en formularios en blanco. No veo nada de malo en usarlo, siempre y cuando esté seguro de que los datos incorrectos de alguna manera no se obtendrán en otro lugar (es decir, como guardarlo a ciegas en una base de datos, lo que parece que no está haciendo). – chobo2

4

Entonces, si no hay nada en su cadena de envío, quiere que ignore verificar si el estado del modelo es válido y asumir que sí lo está.

Sin embargo, sigue adelante y verifique su validación y aparezca en el lado del cliente a través del resumen de validación.

Si realmente no se preocupan por los errores en este caso tratan

ModelState.Clear() 

y eliminar todos los errores fuera de él.

+0

'todavía está avanzando y verifique su validación y aparezca en el lado del cliente' No creo que ese sea el caso, ya que OP dijo en su botón Aceptar que tienen la clase cancelar que asumo discretamente que evita la validación para el lado del cliente –

+0

@Chris Marisic: creo que la validación del lado del cliente está deshabilitada (de lo contrario, el formulario no se completaría) pero tiene un Html.ValidationSummary() que toma todos los errores del lado del servidor y los pone en la página. Finalmente aparece en el lado del cliente. Eso es lo que quise decir al estar en el lado del cliente. – chobo2

Cuestiones relacionadas