DataType(DataType.PhoneNumber)和PhoneAttribute有什么区别

时间:2018-10-31 16:52:28

标签: c# .net data-annotations validationattribute

使用DataType Attribute和传递值DataType.PhonePhone Attribute(继承自- name: Tarball copy copy: src= "{{ '%s/%s' | format( TARBALL_DIR , request.results[.stdout] ) }}" dest= "/tmp/tarball/" - name: Tarball copy copy: src= "{{ '%s/%s' | format( TARBALL_DIR , item.stdout ) }}" dest= "/tmp/tarball/" with_items: "{{ request.results }}" 并自动设置DataType)之间的区别是什么?

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

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

1 个答案:

答案 0 :(得分:5)

TLDR class Person { [Phone] public string PhoneNumber {get;set;} } 提供验证逻辑,而[Phone]不提供

继承链如下:

[DataType]
Attribute
ValidationAttribute
DataTypeAttribute

因此,两者都是PhoneAttribute的实例,但是两者都没有开箱即用地提供验证。 DataType基类仅提供用于分配ValidationAttribute的结构,而将验证覆盖给调用者

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; } } ,因此我不确定.NET为什么不将类和属性标记为abstract来保证实现以编程方式。

IsValid-验证逻辑

因此,如果您确实想提供验证,并且您正在使用.NET 4.5+或.NET Core,则可以使用PhoneAttribute属性,但是验证机制也随着时间而改变。您可能对业务流程的有效输入有不同的规则集。

.NET Framework最初使用以下正则表达式:

[Phone]

但是,在.NET Framework 4.7.2中,每this change description中已弃用此方法,这可能是由于Regular Expression Best Practices中不受限制的输入引起的注入/安全问题。

如果要继续使用正则表达式验证,则必须在const string pattern = @"^(\+\s?)?((?<!\+.*)\(\+?\d+([\s\-\.]?\d+)?\)|\d+)([\s\-\.]?(\(\d+([\s\-\.]?\d+)?\)|\d+))*(\s?(x|ext\.?)\s?\d+)?$"; 文件的configuration> appsettings部分中进行以下设置:

.config

“测试”项目包含一个根据PhoneAttributeTests.cs进行输入/失败的示例,如果要针对(不建议使用的)正则表达式验证引擎测试匹配的输入,请使用Regexr page。 / p>


以下是有关.NET各种风格的源代码和文档的链接:

<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>

注意 | .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 | 的当前文档错误地指出,验证使用的是正则表达式,自4.7.2+或.NET内核中的任何地方以来都是不正确的,因此我ve submitted this PR to update