side - remote validation
RequiredAttribute con AllowEmptyString=true en ASP.NET MVC 3 validaciĆ³n no intrusiva (2)
Si tengo una declaración [Required(AllowEmptyStrings = true)]
en mi modelo de vista, la validación siempre se activa en entradas vacías. Encontré el artículo que explica por qué sucede. ¿Sabes si hay una solución disponible? Si no, ¿cómo lo manejas?
En lugar de decorar el valor con el atributo ''Requerido'', uso lo siguiente. Encuentro que es la solución más simple para este problema.
[DisplayFormat (ConvertEmptyStringToNull = false)]
Nota: Supongo que tiene AllowEmptyStrings = true porque también está usando su modelo de vista fuera de un escenario web; de lo contrario, no parece tener mucho sentido tener un atributo Requerido que permita cadenas vacías en un escenario web.
Hay tres pasos para manejar esto:
- Cree un adaptador de atributo personalizado que agregue ese parámetro de validación
- Registre su adaptador como un adaptador de fábrica
- Sustituya la función de Validación jQuery para permitir cadenas vacías cuando ese atributo esté presente
Paso 1: el adaptador de atributo personalizado
Modifiqué RequiredAttributeAdapter para agregar en esa lógica:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace CustomAttributes
{
/// <summary>Provides an adapter for the <see cref="T:System.Runtime.CompilerServices.RequiredAttributeAttribute" /> attribute.</summary>
public class RequiredAttributeAdapter : DataAnnotationsModelValidator<RequiredAttribute>
{
/// <summary>Initializes a new instance of the <see cref="T:System.Runtime.CompilerServices.RequiredAttributeAttribute" /> class.</summary>
/// <param name="metadata">The model metadata.</param>
/// <param name="context">The controller context.</param>
/// <param name="attribute">The required attribute.</param>
public RequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
: base(metadata, context, attribute)
{
}
/// <summary>Gets a list of required-value client validation rules.</summary>
/// <returns>A list of required-value client validation rules.</returns>
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRequiredRule(base.ErrorMessage);
if (base.Attribute.AllowEmptyStrings)
{
//setting "true" rather than bool true which is serialized as "True"
rule.ValidationParameters["allowempty"] = "true";
}
return new ModelClientValidationRequiredRule[] { rule };
}
}
}
Paso 2. Registra esto en tu global.asax / Application_Start ()
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
DataAnnotationsModelValidatorProvider.RegisterAdapterFactory(typeof(RequiredAttribute),
(metadata, controllerContext, attribute) => new CustomAttributes.RequiredAttributeAdapter(metadata,
controllerContext, (RequiredAttribute)attribute));
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Paso 3. Anular la función de validación "requerida" de jQuery
Esto se hace usando la llamada jQuery.validator.addMethod (), agregando nuestra lógica personalizada y luego llamando a la función original. Puede leer más sobre este enfoque here . Si está utilizando esto en su sitio, quizás en un archivo de script al que se haga referencia desde su _Layout.cshtml. Aquí hay un bloque de script de muestra que puede colocar en una página para probar:
<script>
jQuery.validator.methods.oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function (value, element, param) {
if ($(element).attr(''data-val-required-allowempty'') == ''true'') {
return true;
}
return jQuery.validator.methods.oldRequired.call(this, value, element, param);
},
jQuery.validator.messages.required // use default message
);
</script>