desactivar el atributo data-val-* en tipos primitivos

¿Alguien sabe una forma de desactivar automáticamente MVC3 decorando tipos primitivos con un atributo data-val-*?

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

elimina el atributo data-val-required, pero parece que no puedo encontrar una manera de desactivar los tipos primitivos, por ejemplo: data-val-number

Tengo muchos campos int ocultos que no requieren validación en un formulario, pero debido a estos atributos se están validando, lo que hace que mi aplicación parezca congelada.

preguntado el 22 de mayo de 12 a las 12:05

¿Puede eliminar los atributos de DataAnnotations para esos campos ocultos? -

Esta publicación debería ayudar a deshabilitar atributos de validación discretos para tipos primitivos: http://stackoverflow.com/a/7322464/1604300 -

4 Respuestas

Me imagino que los campos int ocultos tienen el [Required] anotaciones de datos definidas en ellos en el modelo de vista? Si es así, creo que solo necesita eliminar la anotación de datos para evitar que data-val-required atributo de ser mostrado.

Podría estar equivocado, pero sospecho que luego dirá que el campo es obligatorio cuando ese modelo de vista se usa en otras vistas.

Si este es el caso, entonces, en lugar de desactivar las anotaciones de datos (que es esencialmente una solución alternativa), debe definir sus modelos de vista correctamente. Idealmente, cada modelo de vista debería ser específico para la vista que se define (ver patrón 3 de los siguientes aquí). Esto evitará los problemas en los que tiene campos que son obligatorios en algunas vistas y no son obligatorios en otras.

contestado el 22 de mayo de 12 a las 14:05

Los campos int dentro del modelo de vista no están decorados con anotaciones de datos, el problema que tengo es que la validación está ralentizando mi aplicación en campos ocultos que no necesitan validación. MVC está decorando estos campos int con data-val-number, lo que hace que se validen al enviarlos. - Lisa joven

Ahora entiendo lo que quieres decir. Estaba usando tipos de cadena antes, pero de hecho, si usa un tipo de datos int sin anotación de datos, obtiene los atributos data-val-required y data-val-number. Sin embargo, todavía no estoy seguro de por qué esto es un problema. Si está especificando un campo int oculto, debe haber un valor int proporcionado en ese campo, en cuyo caso la validación debería pasar de todos modos (y no estoy seguro de que ralentizaría un poco la aplicación, ya que esta es la validación del lado del cliente). - peligroso

Si no hay un valor para ese campo oculto, ¿podría simplemente no mostrar ese campo en la vista? De esa manera, cuando realice una acción de publicación, no habrá ningún valor para publicar y el archivador solo usará un valor predeterminado. hay una pregunta parecida aquí con la respuesta de Phil Haacks siendo la respuesta de interés para mí. - peligroso

Es un modelo muy complejo con muchas listas de elementos, estos campos ocultos son principalmente identificaciones para las listas, estos deben tener valores, pero los valores se verifican en el lado del servidor, la validación del lado del cliente verifica que contienen números que no necesito hacerlo, creando mi propio ayudante html resolvió el problema. Gracias por tu ayuda. - Lisa joven

Parecía que no podía encontrar una manera de desactivar esto, así que creé mi propio HtmlHelper como una forma de solucionar este problema.

public static IHtmlString HiddenInputFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
        var memberExpression = (MemberExpression)expression.Body;
        string fullID = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(memberExpression.Member.Name);
        var builder = new TagBuilder("input");
        builder.MergeAttribute("type", "hidden");
        var value = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
        builder.MergeAttribute("value", value.ToString());
        string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
        builder.MergeAttribute("name", fullName);
        builder.GenerateId(fullID);
        var tag = builder.ToString(TagRenderMode.SelfClosing);
        return new HtmlString(tag);
    }

contestado el 23 de mayo de 12 a las 08:05

Me di cuenta de que si carga una vista parcial desde una solicitud ajax, las validaciones (data-val-*) dentro de la vista parcial no se agregan automáticamente. Así que finalmente cambié mi código para cargar desde ajax el pesado datos de formulario que no necesitan validaciones.

Respondido el 06 de junio de 12 a las 16:06

Puede especificar data-val="false" en la entrada HTML que está creando en la página, por ejemplo:

<input type="checkbox" name="foo" value="@item.foo" class="input-validation-error"
 data-val="false">

Respondido 30 Abr '13, 09:04

Gracias, quería crear la entrada html usando ayudantes html y el ayudante HiddenFor estaba agregando las anotaciones de tipo primitivo. Creé mi propio ayudante html para solucionar esto y publiqué el código en una respuesta separada. - Lisa joven

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.