atr*_*eon 4 c# validation asp.net-mvc custom-attributes
我想创建一个调用其他验证属性的自定义验证属性。
例如,我想创建一个名为PasswordValidationAttribute. 我希望它装饰它被限定在与所述属性RequiredAttribute,RegularExpressionAttribute和StringLengthAttribute具有限定(诸如密码和一个最大和最小字符串长度的正则表达式)的各种参数。
我正在努力从哪里开始,确定涉及多少工作并确定它是否可能。一旦将此属性应用于属性,我希望它ValidationMessageFor HtmlHelper正确处理并执行服务器端调用。我希望我不需要重新定义它们(否则工作量太大)。
对于.net 4,它可能看起来像:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class MyValidationAttribute : ValidationAttribute
{
private readonly bool isRequired;
public string Regex { get; set; }
public int StringLength { get; set; }
public MyValidationAttribute(bool isRequired)
{
this.isRequired = isRequired;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var composedAttributes = ConstructAttributes().ToArray();
if (composedAttributes.Length == 0) return ValidationResult.Success;
var errorMsgBuilder = new StringBuilder();
foreach (var attribute in composedAttributes)
{
var valRes = attribute.GetValidationResult(value, validationContext);
if (valRes != null && !string.IsNullOrWhiteSpace(valRes.ErrorMessage))
errorMsgBuilder.AppendLine(valRes.ErrorMessage);
}
var msg = errorMsgBuilder.ToString();
if (string.IsNullOrWhiteSpace(msg))
return ValidationResult.Success;
return new ValidationResult(msg);
}
private IEnumerable<ValidationAttribute> ConstructAttributes()
{
if (isRequired)
yield return new RequiredAttribute();
if (Regex != null)
yield return new RegularExpressionAttribute(Regex);
if (StringLength > 0)
yield return new StringLengthAttribute(StringLength);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
[MyValidationAttribute(true, Regex = "[a-z]*", StringLength = 3)]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
在.net 3.5 中有一个限制,即您不能从底层属性动态构造消息值(至少我无法通过它)。您只能为每个属性设置一条消息。
改变的一切都在方法里面IsValid。
public override bool IsValid(object value)
{
var composedAttributes = ConstructAttributes().ToArray();
if (composedAttributes.Length == 0) return true;
return composedAttributes.All(a => a.IsValid(value));
}
Run Code Online (Sandbox Code Playgroud)
请注意ErrorMessage:
的返回值IsValid的方法,ValidationAttribute在.NET 3.5是不是ValidationResult,但bool。当我尝试设置 时ErrorMessage,我收到了value can be set only once.
| 归档时间: |
|
| 查看次数: |
4512 次 |
| 最近记录: |