que tienen un modelo simple:Cómo deshabilitar ModelMetadata.IsRequired de ser siempre cierto para el valor no anulable tipo
public class Sample
{
public bool A { get; set; }
[Required]
public bool B { get; set; }
}
Una obviamente, no es necesario. Por lo tanto, para la validación han establecido DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false
en Global.asax.
también tengo un simple asistente de HTML que imprime verdadero o falso si se requiere el modelo:
public static class HtmlHelperExtensions
{
public static MvcHtmlString IsRequired<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
return new MvcHtmlString(metadata.IsRequired.ToString());
}
}
También escribí una vista para mostrar mi problema:
@model MvcApplication10.Models.Sample
A: @Html.IsRequired(m => m.A), B: @Html.IsRequired(m => m.B)
lo que habría esperado esto para imprimir A: false, B: true
, sin embargo, realmente imprime A: true, B: true
.
¿Hay alguna manera de hacer que esta impresión sea el resultado esperado? IsRequired
parece que siempre es verdadero aunque no configuré explícitamente el RequiredAttribute
. El docs establece que es verdadero para los tipos de valores que no aceptan valores de null por defecto. ¿Cómo es que no hay una manera fácil de configurar esto en falso como lo hacemos con la validación?
EDITAR: Podría escribir un proveedor personalizado como este, pero me preguntaba si había una manera "fácil" en torno a esto:
public class ExtendedDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
private static bool addImplicitRequiredAttributeForValueTypes = false;
public static bool AddImplicitRequiredAttributeForValueTypes
{
get
{
return addImplicitRequiredAttributeForValueTypes;
}
set
{
addImplicitRequiredAttributeForValueTypes = value;
}
}
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var result = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
if (!AddImplicitRequiredAttributeForValueTypes && modelType.IsValueType && !attributes.OfType<RequiredAttribute>().Any())
{
result.IsRequired = false;
}
return result;
}
}
En MVC5 simplemente poniendo 'DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false' hace ahora tienen el efecto esperado de no añadir automáticamente' RequiredAttribute' de valor que no sea anulable tipos. – Cocowalla