2

谁能解释为什么假定不可为空的类型属性应始终具有RequiredAttribue?

我正在尝试编写一个标签助手,它将自动附加 * 或更改 css 类,以便我可以向用户指示该字段是必需的。但是,在查询元数据时,不可为空的属性最终会带有必需的属性。

MVC 源代码:

protected override IEnumerable<ModelValidator> GetValidators(
    ModelMetadata metadata, ControllerContext context,
    IEnumerable<Attribute> attributes)
{
    _adaptersLock.EnterReadLock();

    try
    {
        List<ModelValidator> results = new List<ModelValidator>();

        if (metadata.IsRequired &&
            !attributes.Any(a => a is RequiredAttribute))
        {
            //******* Why Do this? 
            attributes = attributes.Concat(new[] { new RequiredAttribute() });
        }

        foreach (ValidationAttribute attribute in
            attributes.OfType<ValidationAttribute>())
        {
            DataAnnotationsModelValidationFactory factory;

            if (!_adapters.TryGetValue(attribute.GetType(), out factory))
                factory = _defaultFactory;

            results.Add(factory(metadata, context, attribute));
        }

        return results;
    }
    finally
    {
        _adaptersLock.ExitReadLock();
    }
}
4

1 回答 1

2

就个人而言,我认为这是因为框架的设计者错过了可空数据的重点!

他们似乎假设如果一个字段不可为空,则它必须是必需的。

不幸的是,正如您可能发现的那样,情况并非总是如此。

我能想到的最常见的例子是用户提供的一个文本字段,它可能是空白的,但您希望将其保持为 NULL,直到用户提供了一个值。在这种情况下,您会得到三种有效情况:“未设置”(NULL)、“空”(非 NULL)或实际值。

所以 - 回答你的问题,不 - 我无法解释。也许这是一个错误?

于 2010-01-25T19:08:34.760 回答