2012-01-31 16 views
5

tôi định nghĩa một biến nhưASP.MVC3 ModelState.IsValid không bao gồm RemoteAttribute kiểm tra

public class EditModel 
{ 
    [Remote("IsNameAvailable", "Home", ErrorMessage = "Name is in use.")] 
    [Display(Name = "Name")] 
    public string Name{ get; set; } 
} 

và trong bộ điều khiển Trang chủ

public JsonResult IsNameAvailable(string name) 
{ 
    if (duplicate) 
     return Json(false, JsonRequestBehavior.AllowGet); 
    else 
     return Json(true, JsonRequestBehavior.AllowGet); 
} 

nhưng khi tôi kiểm tra ModelState.IsValid trong Lưu hành động, nó luôn luôn trả về true ngay cả khi tôi có thể thấy hiển thị thông báo lỗi trên View.

public ActionResult Save(EditModel editModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Return to view and display error in view 
     return View("Home", editModel); 
    } 

    //Input data is valid and save record 
    Repository.Save(editModel.Name); 
} 

[Vấn đề]
Làm thế nào có thể kiểm tra ModelState cũng là Validation rules bởi RemoteAttribure trong một mô hình?

Trả lời

2

Bạn có hai tùy chọn. Bạn có thể thực hiện giao diện IDataErrorInfo hoặc IValidatableObject và làm lại xác thực ở đó. Các giao diện này được hỗ trợ ngoài MVC và ModelState của bạn sẽ phản ánh điều này.

Tùy chọn khác của bạn đang tạo thuộc tính của riêng bạn có nguồn gốc từ RemoteAttribute. Trong thuộc tính tùy chỉnh này, thêm logic để áp dụng cùng một phía máy chủ xác thực.

Tùy chọn cuối cùng là tùy chọn tôi sẽ thực hiện, nhưng điều đó sẽ mất thêm một chút thời gian. This question sẽ giúp bạn với nó mặc dù.

+0

Cảm ơn bạn đã đề xuất! Trường hợp là tôi có nhiều mô hình như vậy và tôi muốn tìm tùy chọn tốt nhất để giảm mã. Các tùy chọn đầu tiên và thứ hai cần mã phụ thuộc vào số lượng mô hình sử dụng thuộc tính từ xa. Bạn có thể giải thích thêm về tùy chọn cuối cùng không? – daniel

+2

Phương pháp IsValid của RemoteAttribute thực sự được gọi là serverside. Nếu bạn nhìn vào phương thức này với trình giải mã .NET, bạn sẽ thấy rằng tất cả phương thức này thực hiện là "trả về true;". Tạo thuộc tính của riêng bạn có nguồn gốc từ RemoteAttribute và đặt một số logic xác nhận thực tế trong phương thức IsValid() đó. Ví dụ, bạn có thể tạo một thuộc tính bổ sung trên thuộc tính của riêng bạn, hãy nói ValidationMethod. Khi sử dụng thuộc tính, bạn có thể chuyển theo phương thức cần thực hiện xác thực. Và trong phương thức IsValid() của bạn, bạn có thể gọi phương thức xác thực đó. –