2010-06-29 20 views
7

Tôi có Thuộc tính xác thực dữ liệu tùy chỉnh mà tôi đã tạo để đảm bảo mật khẩu mà người dùng nhập vào giống nhau, nhưng IsValid không bao giờ được gọi.Chú thích dữ liệu tùy chỉnh IsValid không bao giờ được gọi. (ASP.NET MVC 2 .NET 4)

Tuỳ thuộc tính:

public class IsSameAsAttribute : ValidationAttribute 
{ 
    public String TargetProperty { get; set; } 
    private readonly object _typeId = new object(); 

    public IsSameAsAttribute(string targetProperty) 
    { 
     TargetProperty = targetProperty; 
    } 

    public override bool IsValid(object value) 
    { 
     return false; 
     //Type objectType = value.GetType(); 
     //bool isValid = false; 

     //PropertyInfo[] neededProperties = 
     // objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == TargetProperty).ToArray(); 

     //return isValid; 
    } 

    public override object TypeId 
    { 
     get { return _typeId; } 
    } 
} 

mô hình dữ liệu nó được áp dụng cho:

public class RegistrationData 
{ 
    [Required(ErrorMessage = "First Name Required")] 
    [StringLength(100, ErrorMessage = "First Name must be 100 characters or less.")] 
    public String FirstName { get; set;} 

    [Required(ErrorMessage = "Last Name Required")] 
    [StringLength(100, ErrorMessage = "Last Name must be 100 characters or less.")] 
    public String LastName { get; set; } 

    [Required(ErrorMessage = "Email is Required")] 
    [StringLength(200, ErrorMessage = "Email must be 200 characters or less.")] 
    [RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")] 
    public String Email { get; set; } 

    [Required(ErrorMessage = "Password is required")] 
    public String Password { get; set; } 

    [IsSameAs("Password")] 
    public String PasswordRepeat { get; set; } 

    [Required(ErrorMessage = "Division is required")] 
    public String Division { get; set; } 

} 

Và Controller nơi nó được gọi là từ:

[HttpPost] 
public ActionResult ValidationDemo(RegistrationData model) 
{ 
    if (ModelState.IsValid) 
    { 
     return Redirect("/"); 
    } 

    return View(model); 
} 

Tất cả xác thực "ngoài hộp" hoạt động chính xác, nó chỉ là tùy chỉnh của tôi không được gọi. Trong khi thực hiện gỡ lỗi, tôi thấy rằng nó được khởi tạo khi hàm tạo được gọi, nhưng một điểm ngắt trên IsValid không bao giờ được nhấn.

Điều gì đang diễn ra và cách khắc phục sự cố?

CẬP NHẬT

Được rồi tôi fiddled số và nếu tôi gọi TryUpdateModel (mô hình) trong bộ điều khiển của tôi nó cuối cùng gọi IsValid. Vì vậy, điều này ngụ ý với tôi rằng thuộc tính tùy chỉnh của tôi không nhận được "đăng ký" với bất cứ điều gì chạy xác nhận trong MVC 2. Có cách nào để giải quyết vấn đề này?

[HttpPost] 
public ActionResult ValidationDemo(RegistrationData model) 
{ 
    TryValidateModel(model); // <--- *** Added this line and it "works" 

    if (ModelState.IsValid) 
    { 
     return Redirect("/"); 
    } 

    return View(model); 
} 
+1

Bạn đã đăng ký bộ điều hợp để sử dụng cùng với thuộc tính xác thực tùy chỉnh của bạn với 'DataAnnotationsModelValidatorProvider.RegisterAdapter'? –

Trả lời

0

Bạn đã cố gắng điền vào tất cả các trường khác để tất cả xác nhận hợp lệ được đáp ứng và xem liệu xác thực tùy chỉnh của bạn có được kích hoạt không? Nếu xác thực khách hàng không hài lòng, biểu mẫu sẽ bị chặn đăng lại và do đó xác thực tùy chỉnh phía máy chủ của bạn sẽ không bị trigerred,

Để thuộc tính xác thực tùy chỉnh của bạn hoạt động ở phía máy khách, một số công việc bổ sung có được làm.

Đọc trên bài xuất sắc Phil trên xác nhận ở đây: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

+0

Hiện tại tôi không thực hiện xác nhận hợp lệ phía khách hàng để thử và làm việc này. Ít nhất tôi không nghĩ là tôi. Hmm tôi có lẽ nên kiểm tra điều đó. Tuy nhiên, tôi đã chạy điểm phá vỡ trên ModelState.IsValid trong bộ điều khiển và bộ sưu tập lỗi của Model không bao giờ có lỗi cho các mục xác thực tùy chỉnh của tôi. Và có, trước khi cập nhật của tôi, tôi điền vào biểu mẫu và nó vẫn không kích hoạt thuộc tính xác thực tùy chỉnh. :( – Jack

+0

hmm, do đó, giả định của tôi là sai, và điều này là thật sự lạ.Bạn có thể gửi mã cho bạn [HttpGet] phương pháp và xem? –

3

tôi nhìn thấy a/cùng/liên quan vấn đề tương tự với MVC2 - xác nhận đẳng cấp mức được gọi là chỉ khi tất cả các thuộc tính xác nhận một cách chính xác.

Vì vậy, nhiều thuộc tính có thể không thành công và tất cả thông báo xác thực được thêm vào trạng thái mô hình (và được hiển thị trên máy khách.) Nhưng thông báo xác thực cấp lớp không nằm trong số đó; các IsValid trên những chỉ được gọi là nếu tài sản vượt qua. Bit một bummer từ một quan điểm khả năng sử dụng nhưng nó hoạt động.

Tôi là không gọi TryValidateModel().