2013-02-12 148 views
8

我构建了一个自定义ValidationAttribute,因此我可以验证系统中的唯一电子邮件地址。但是,我想传递一个自定义参数以添加更多逻辑到我的验证。将自定义参数传递给ValidationAttribute

public class UniqueEmailAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     //I need the original value here so I won't validate if it hasn't changed. 
     return value != null && Validation.IsEmailUnique(value.ToString()); 
    } 
} 

回答

21

是这样的吗?

public class StringLengthValidatorNullable : ValidationAttribute 
{ 
    public int MinStringLength { get; set; } 
    public int MaxStringLength { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
     { 
      return true; 
     } 
     var length = value.ToString().Length; 

     if (length < MinStringLength || length >= MaxStringLength) 
     { 
      return false; 
     } 
     return true; 
    } 
} 

用途:

[StringLengthValidatorNullable(MinStringLength = 1, MaxStringLength = 16)] 
public string Name {get; set;} 
+0

种类,但我只能通过这种方式传递常量,正确吗?我想传入原始值以与正在验证的值进行比较。 – 2013-02-14 16:11:43

+0

是的,只有常数。我不确定我是否会收到您的问题。验证器只能验证一个属性的当前值,它不知道任何属性的过去值。 – Oliver 2013-02-14 16:19:33

+0

这就是我想要做的。 – 2013-02-14 16:50:36

0

我建议像@奥利弗的回答(这就是我会做,反正),但后来我发现,你不希望传递的常数。

那么这样的事情呢?

public static class MyConfig 
{ 
    public static int MinStringLength { get; set; } 
    public static int MaxStringLength { get; set; } 
    public static SomeObject otherConfigObject { get; set; } 
} 

然后从验证中访问MyConfig.MinStringLength? 虽然我会同意它不太漂亮。

1

有一个类似的要求,我必须将值传递给自定义属性。

这里的问题是,属性装饰不允许变量。 你得到编译时错误:

An object reference is required for the non-static field, method, or property

这是我如何能做到这一点:

在控制器

[FineGrainAuthorization] 
public class SomeABCController : Controller 
{ 
    public int SomeId { get { return 1; } } 
} 

在属性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class FineGrainAuthorizationAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     ControllerBase callingController = filterContext.Controller; 
     var someIdProperty = callingController.GetType().GetProperties().Where(t => t.Name.Equals("SomeId")).First(); 
     int someId = (int) someIdProperty.GetValue(callingController, null); 
    } 
} 

请记住.Name.Equals("SomeId")内的字符串必须与声明的大小写匹配public int SomeId

相关问题