gpt4 book ai didi

c# - 如何禁用 ModelMetadata.IsRequired 对于不可空值类型始终为真

转载 作者:可可西里 更新时间:2023-11-01 07:55:31 24 4
gpt4 key购买 nike

我有一个简单的模型:

public class Sample
{
public bool A { get; set; }

[Required]
public bool B { get; set; }
}

A 显然不是必需的。因此,为了验证,在 Global.asax 中设置了 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false

我还有一个简单的 html 帮助程序,如果需要模型,它会打印 true 或 false:

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());
}
}

我还写了一个 View 来展示我的问题:

@model MvcApplication10.Models.Sample

A: @Html.IsRequired(m => m.A), B: @Html.IsRequired(m => m.B)

我原以为它会打印A: false, B: true,然而,它实际上打印了A: true, B: true

有什么方法可以让这个打印结果符合我的预期吗? IsRequired 似乎总是返回 true,即使我没有明确设置 RequiredAttributedocs声明默认情况下对于不可空值类型为真。为什么没有像我们通过验证那样将其设置为 false 的简单方法?

编辑:我可以像这样编写一个自定义提供程序,但我想知道是否有一种“简单”的方法解决这个问题:

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;
}
}

最佳答案

如您所述,ValueTypes 将默认为 true。要解决此问题,您可以检查 RequiredAttribute 类型是否为 ValueType

ModelMetadata metaData = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);

if ((metaData.ModelType.IsValueType && metaData.ModelType.GetCustomAttributes(typeof(RequiredAttribute), false).Any()) ||
(!metaData.ModelType.IsValueType && metaData.IsRequired))
{ ... }

关于c# - 如何禁用 ModelMetadata.IsRequired 对于不可空值类型始终为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com