使用DataType Attribute并传入DataType.Phone值和从Phone继承并自动设置DataTypeDataType.Phone Attribute有什么区别?

这两类之间有什么区别吗?

class Person {
   [DataType(DataType.PhoneNumber)]
   public string PhoneNumber {get;set;}
}


class Person {
   [Phone]
   public string PhoneNumber {get;set;}
}

最佳答案

TLDR:[Phone]提供验证逻辑,而[DataType]不提供
继承链如下所示:
Attribute
ValidationAttribute
DataTypeAttribute
PhoneAttribute
因此,这两个都是ValidationAttribute的实例,但是都不提供开箱即用的验证。 DataType基类仅提供用于分配enum DataType的结构,而将覆盖验证保留给调用者
DataType-根据文档:

DataTypeAttribute属性应用于数据字段时,必须执行以下操作:

发出适当的验证错误。


DataType-根据源代码:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Parameter, AllowMultiple = false)]
public class DataTypeAttribute : ValidationAttribute
{
    /// <summary> Override of <see cref="ValidationAttribute.IsValid(object)" /> </summary>
    /// <remarks>This override always returns <c>true</c>.  Subclasses should override this to provide the correct result.</remarks>
    /// <param name="value">The value to validate</param>
    /// <returns>Unconditionally returns <c>true</c></returns>
    /// <exception cref="InvalidOperationException"> is thrown if the current attribute is ill-formed.</exception>
    public override bool IsValid(object value)
    {
        EnsureValidDataType();

        return true;
    }
 }

另外:由于要求您重写IsValid,所以我不确定.NET为什么没有将类和属性标记为abstract来以编程方式保证实现。
PhoneAttribute-验证逻辑
因此,如果您确实想提供验证,并且使用的是.NET 4.5+或.NET Core,则可以使用[Phone]属性,但是验证机制也随时间而改变,并且您可能会有所不同关于什么构成业务流程的有效输入的一组规则。
.NET Framework最初使用以下正则表达式:
const string pattern = @"^(\+\s?)?((?<!\+.*)\(\+?\d+([\s\-\.]?\d+)?\)|\d+)([\s\-\.]?(\(\d+([\s\-\.]?\d+)?\)|\d+))*(\s?(x|ext\.?)\s?\d+)?$";

但这在.NET Framework 4.7.2中每个this change description中已弃用,这可能是由于Regular Expression Best Practices中不受限制的输入引起的注入/安全问题。
如果要继续使用正则表达式验证,则必须在configuration文件的appsettings> .config部分中设置以下内容:
<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>


测试项目包括根据PhoneAttributeTests.cs应通过/失败哪些输入的示例,如果要针对(不建议使用的)正则表达式验证引擎测试匹配的输入,则为Regexr page

这是一些用于各种.NET版本的源代码和文档的链接:
                  | .NET Core         | .NET Core 2.1  |  .NET 4.7.2     | .NET           |
------------------|-------------------|----------------|-----------------|----------------|
DataTypeAttribute | github.com/dotnet | source.dot.net | referencesource | docs.microsoft |
PhoneAttribute    | github.com/dotnet | source.dot.net | referencesource | docs.microsoft |

注意:当前[Phone]的文档错误地指出验证使用正则表达式,自4.7.2+或.NET Core中的任何地方以来,这都是不正确的,因此我submitted this PR to update

关于c# - DataType(DataType.PhoneNumber)和PhoneAttribute有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53088476/

10-15 03:53