Sai*_*udo 7 .net c# validation data-annotations
我有一个客户类,它同时具有PhoneNumber和Email属性.使用DataAnnotations我可以使用DataType验证属性来修饰属性,但我看不出是什么让我感到困惑.
例如:
[DataType(DataType.PhoneNumber)]
public string PhoneNumber {get; set;}
Run Code Online (Sandbox Code Playgroud)
我有一个单元测试,为此属性分配了"1515999A".当我单步执行验证运行器时,该值被认为对电话号码有效.我原以为这应该是无效的.
我在一些人周围搜索,但找不到各种枚举的DataTypes实际捕获的正确解释.某处有值得参考的地方吗?
编辑:
以下是我用于验证跑步者的内容......
public virtual XLValidationIssues ValidateAttributes<TEntity>(TEntity entity)
{
var validationIssues = new XLValidationIssues();
// Get list of properties from validationModel
var props = entity.GetType().GetProperties();
// Perform validation on each property
foreach (var prop in props)
ValidateProperty(validationIssues, entity, prop);
// Return the list
return validationIssues;
}
protected virtual void ValidateProperty<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property)
{
// Get list of validator attributes
var validators = property.GetCustomAttributes(typeof(ValidationAttribute), true);
foreach (ValidationAttribute validator in validators)
ValidateValidator(validationIssues, entity, property, validator);
}
protected virtual void ValidateValidator<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property, ValidationAttribute validator)
{
var value = property.GetValue(entity, null);
if (!validator.IsValid(value))
validationIssues.Add(new XLValidationIssue(property.Name, value, validator.FormatErrorMessage(property.Name, value)));
}
Run Code Online (Sandbox Code Playgroud)
我在网上找不到关于DataType.PhoneNumber的内容,但我确实发现了这个:
http://forums.asp.net/p/1370546/2863383.aspx
在RTM版本中,DataType.EmailAddress仅用于标记您自己使用的数据类型.
我想找到更多,所以我拿出Red Gate的.NET Reflector并开始挖掘.
查看DataTypeAttribute类,Joseph Daigle就位于其中 - 每个DataType属性都不进行任何验证; 总是返回true(即"有效").在某些数据类型上,完成了一些自定义显示字符串格式化.但是,电话号码几乎不受影响.
所以,我研究了这个问题的可能解决方案.从我发现的,这看起来是最好的:
public class EvenNumberAttribute : ValidationAttribute
{
public EvenNumberAttribute() : base(() => Resource1.EvenNumberError) { }
public EvenNumberAttribute(string errorMessage) : base(() => errorMessage) { }
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value == null)
{
return ValidationResult.Success;
}
int convertedValue;
try
{
convertedValue = Convert.ToInt32(value);
}
catch (FormatException)
{
return new ValidationResult(Resource1.ConversionError);
}
if (convertedValue % 2 == 0)
{
return ValidationResult.Success;
}
else
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这可以验证数字是奇数还是偶数.你可以写为******中国,Email等自定义验证属性,实际上做验证.
| 归档时间: |
|
| 查看次数: |
3699 次 |
| 最近记录: |