ASP.NET MVC - 数据注释 - 为什么要添加默认的RequiredAttribute?

时间:2010-01-25 15:57:20

标签: asp.net asp.net-mvc-2 data-annotations

有人可以解释为什么假设非可空类型属性应该始终具有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();
    }
}

1 个答案:

答案 0 :(得分:2)

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

看起来他们假设如果某个字段不可为空,则必须要求它。

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

我能想到的最常见的一个例子是用户提供的文本字段,该文本字段可能是空白的,但是在用户提供值之前,您希望将其保持为NULL。在这种情况下,您会得到三个有效的案例:'Not Set'(NULL),'Empty'(非NULL)或实际值。

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