2013-02-12 19 views
8

Tôi đã tạo một ValidationAttribute tùy chỉnh để tôi có thể xác thực địa chỉ email duy nhất trong hệ thống của mình. Tuy nhiên, tôi muốn chuyển một tham số tùy chỉnh bằng cách nào đó để thêm nhiều logic hơn vào việc xác thực của tôi.Chuyển các thông số tùy chỉnh vào 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()); 
    } 
} 

Trả lời

21

Như thế này?

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; 
    } 
} 

Sử dụng:

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

Loại, nhưng tôi chỉ có thể vượt qua các hằng số theo cách đó, đúng không? Tôi muốn chuyển giá trị ban đầu để so sánh với giá trị đang được xác thực. –

+0

Có, chỉ các hằng số. Tôi không chắc chắn nếu tôi nhận được câu hỏi của bạn. Trình xác nhận hợp lệ chỉ có thể xác nhận giá trị hiện tại của một poperty, nó không biết về bất kỳ giá trị nào trong quá khứ của một thuộc tính. – Oliver

+0

Đó là những gì tôi đang cố gắng làm. –

0

tôi sẽ đề nghị một cái gì đó như @ câu trả lời của Oliver (đó là những gì tôi muốn làm, dù sao), nhưng sau đó tôi nhận thấy rằng bạn không muốn vượt qua hằng số.

Thế thì sao về cái gì đó như thế này?

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

Sau đó truy cập MyConfig.MinStringLength từ xác thực? Tôi sẽ đồng ý rằng nó không phải là quá đẹp, mặc dù.

1

Đã có yêu cầu tương tự, trong đó tôi phải chuyển một giá trị sang thuộc tính tùy chỉnh.

Vấn đề ở đây là trang trí Thuộc tính không cho phép biến. Bạn nhận được biên dịch lỗi thời gian:

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

Sau đây là cách tôi đã có thể làm điều đó:

Trong điều khiển

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

Trong Thuộc tính

[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); 
    } 
} 

Hãy nhớ rằng chuỗi bên trong .Name.Equals("SomeId") phải khớp với tuyên bố public int SomeId

Các vấn đề liên quan