2011-04-12 76 views
60

Estoy usando ASP .NET MVC 3 con anotaciones de datos y el complemento jQuery validate.ASP .NET MVC Desactivar validación del lado del cliente en el nivel por campo

¿Hay alguna forma 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.

Respuesta

93

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

Puede simplemente desactivar la validación del lado del cliente en la vista Razor antes de renderizar el campo y volver a habilitar la validación del lado del cliente después de que se haya renderizado el campo.

Ejemplo:

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

Aquí deshabilitar la validación del lado del cliente para el campo BATCHID.

También he desarrollado un poco de ayuda 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 va a usar de la siguiente manera:

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

Si alguien tiene mejores soluciones por favor hágamelo saber!

Espero que esta ayuda.

+3

Funciona muy bien usando MVC 4 ... – ChrFin

+2

Bueno, excepto que activa la validación incluso si estaba desactivada para empezar. –

+3

¡Sin duda se puede mejorar! –

7

Suponiendo que utiliza la validación no intrusiva predeterminada, puede utilizar algunos javascript para eliminar las reglas en el lado del cliente. Eche un vistazo a Plugins/Validation/rules

66

Puede desactivar la validación del lado del cliente discreta para un solo campo mediante la adición de un atributo data-val='false':

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

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

(Nota el subrayado en data_val anteriormente. MVC convierte automáticamente los guiones de guiones en las propiedades de tipo anónimo, por lo que se convierte en data_valdata-val cuando se representa el HTML)

+0

A menos que ponga el guión bajo, IIS me da una excepción. Mensaje de error del compilador: CS0746: declarante de miembro de tipo anónimo no válido. Los miembros de tipo anónimo deben declararse con una asignación de miembro, nombre simple o acceso de miembro. – csharpforevermore

+2

No funcionó para mí –

+1

Esto funcionó como un amuleto y es la solución más limpia para este problema que he encontrado hasta ahora. –

11

uso MVC5 jQuery.validar

http://jqueryvalidation.org/rules/

Si desea eliminar validaciones en MVC5 del lado del cliente que tiene que hacer lo siguiente:

Eliminar todas las validaciones sobre 'myInput'

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

validaciones específicas

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

Listado de la v alidations pueden ayudar

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

Entonces tendrá que corregir su código subyacente para validar manualmente su modelo o diferente porque ModelState.IsValid será falsa. Usar ModelState.Clear() y TryValidateModel puede ser útil.

Editar:

desactivación del control también eliminar las validaciones.

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

Para lograr este objetivo en el escenario dado, tenemos que hacer dos ajustes.

lado del cliente

Para desactivar la validación del lado del cliente, tenemos que desactivar por la fuerza.

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

Tenga en cuenta que @ data_val = "false". Deshabilitará la validación en este campo.

el lado del servidor (en acción)

Cuando el modelo se valida en la acción posterior, ModelState.IsValid siempre devolverá 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); 

Me explico, primero recuperamos la información actual guardado en la base de datos que estamos utilizando más adelante para asignar 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.

Cuestiones relacionadas