ASP .NET MVC Desactiva la validación del lado del cliente en el nivel por campo

Estoy usando ASP .NET MVC 3 con anotaciones de datos y el complemento jQuery validate.

¿Hay alguna manera de marcar que un determinado campo (o cierta anotación de datos) solo debe validarse en el servidor?

Tengo un campo de número de teléfono con un complemento de enmascaramiento y el validador de expresiones regulares se vuelve loco al final del usuario. La expresión regular solo es a prueba de errores (en caso de que alguien decida piratear la validación de JavaScript), por lo que no es necesario que se ejecute en el lado del cliente. Pero aún me gustaría que la otra validación se ejecute en el lado del cliente.

No estoy seguro de si esta solución funciona en MVC3. Sin duda funciona en MVC4:

Simplemente puede deshabilitar la validación del lado del cliente en la vista Razor antes de procesar el campo y volver a habilitar la validación del lado del cliente después de que se haya renderizado el campo.

Ejemplo:

@{ Html.EnableClientValidation(false); } @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) @{ Html.EnableClientValidation(true); }

Aquí desactivamos la validación del lado del cliente para el campo BatchId.

También he desarrollado un pequeño ayudante para esto:

 public static class YnnovaHtmlHelper { public static ClientSideValidationDisabler BeginDisableClientSideValidation(this HtmlHelper html) { return new ClientSideValidationDisabler(html); } } public class ClientSideValidationDisabler : IDisposable { private HtmlHelper _html; public ClientSideValidationDisabler(HtmlHelper html) { _html = html; _html.EnableClientValidation(false); } public void Dispose() { _html.EnableClientValidation(true); _html = null; } } 

Lo usarás de la siguiente manera:

 
@using (Html.BeginDisableClientSideValidation()) { @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) }

Si alguien tiene mejores soluciones, ¡házmelo saber!

Espero que esto ayude.

Puede desactivar la validación no intrusiva del lado del cliente para un solo campo agregando un atributo data-val='false' :

 @Html.TextBoxFor(m => m.BatchId, new { data_val = "false" }) 

Esto anulará el atributo data-val='true' que MVC agrega debido a cualquier atributo System.ComponentModel.DataAnnotations . El elemento HTML seguirá decorado con otros atributos de validación (por ejemplo, data-val-required) pero no tendrá ningún efecto.

( Observe el guión bajo en data_val anterior. MVC convierte automáticamente guiones bajos a guiones en propiedades de tipo anónimas, de modo que data_val convierte en data-val cuando se renderiza el HTML)

MVC5 usa jquery.validate

http://jqueryvalidation.org/rules/

Si desea eliminar validaciones en MVC5 del lado del cliente, debe hacer lo siguiente:

Eliminar todas las validaciones en ‘myinput’

 $("#myinput").rules("remove"); 

Validaciones específicas

 $("#myinput").rules("remove", "min max" ); 

Enumerar las validaciones puede ayudar

 $("#myinput").rules(); 

Luego deberá corregir su código para validar su modelo manualmente o de manera diferente porque ModelState.IsValid será falso. El uso de ModelState.Clear() y TryValidateModel puede ser útil.

Editar:

Al deshabilitar el control también se eliminan las validaciones.

 $("#myinput").attr('disabled', disabledValue); 

Suponiendo que utiliza la validación discreta por defecto, puede utilizar algunos javascript para eliminar las reglas en el lado del cliente. Eche un vistazo a Complementos / Validación / reglas

Para lograr este objective en el escenario dado, debemos hacer dos ajustes.

Lado del cliente

Para deshabilitar la validación del lado del cliente, debemos desactivarlo por la fuerza.

 @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @data_val = "false" , @class = "form-control"} }) 

Note el @ data_val = “falso”. Deshabilitará la validación en este campo.

Lado del servidor (en acción)

Cuando el modelo se valida en la acción posterior, ModelState.IsValid siempre devuelve falso porque no se proporciona la contraseña. Aquí tenemos que proporcionar la contraseña actual al modelo y volver a validar el modelo.

 var userObj = db.Users_Info.Where(a => a.Id == users_Info.Id).FirstOrDefault(); if (String.IsNullOrEmpty(users_Info.Password)) { users_Info.Password = userObj.Password; } ModelState.Clear(); TryValidateModel(users_Info); 

Permítanme explicar, primero recuperamos la información actual guardada en la base de datos que estamos usando más tarde para asignarla al modelo actual si no se proporciona la contraseña. Las dos últimas líneas en realidad restablecieron el estado del modelo para devolver el resultado actualizado en ModelState.IsValid.

Si desea eliminar validaciones en MVC5 del lado del cliente, debe hacer lo siguiente:

 $("#Email").rules("remove", { "required", "minlength", "email" } });