2011-08-18 22 views
13

Tôi bị ướt chân với Khung thực thể và tự hỏi liệu có cách nào để tôi kiểm tra trạng thái mô hình mà không cần mô hình ràng buộc xảy ra hay không.Tôi có thể kiểm tra modelstate mà không cần modelbinding không?

Giả sử tôi tạo người dùng chủ yếu từ mã, có cách nào để tôi kiểm tra để đảm bảo rằng nó hợp lệ theo chú thích dữ liệu được xác định trước của tôi trước khi tôi cập nhật không?

public ActionResult Index() 
    { 
     User u = new User(); 
     u.Username = "test"; 
     u.Password = "test"; 
     u.Email = "test"; 

     DefaultContext db = new DefaultContext();    

     if (ModelState.IsValid) 
     { 
      db.Users.Add(u); 
      db.SaveChanges(); 
      Response.Write(u.Id); 
     } 
     else 
      // model is not valid 

     return View(); 
    } 

Mã trên không hoạt động vì không có sự ràng buộc nào xảy ra. Hoặc có lẽ tôi đang bối rối về quá trình này.

Cảm ơn.

Trả lời

17

ModelState sẽ không khả dụng vì được thiết lập bởi trình kết nối mô hình. ModelBinder không ràng buộc một mô hình để nó không chạy xác nhận do đó ModelState sẽ trống.

Nhưng điều đó không ngăn bạn sử dụng thuộc tính và thực hiện xác thực.

Giả sử bạn đang sử dụng thuộc tính DataAnnotation, bạn có thể chạy xác thực mà không cần ràng buộc mô hình.

Với lớp này:

public class Widget 
{ 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public decimal Price { get; set; } 
} 

Bạn có thể làm điều này:

 var widget = new Widget 
         { 
          Id = 12, 
          Price = 15.57M 
         }; 

     var context = new ValidationContext(widget, null, null); 
     var results = new List<ValidationResult>(); 
     if(Validator.TryValidateObject(widget, context, results, true)) 
     { 
      //Validation Successful 
     } 
     else 
     { 
      //Validation Failed 
     } 

Thuộc tính Name không được thiết lập và TryValidateObject() sẽ thất bại. Việc thu thập kết quả sẽ có lỗi thực sự xảy ra.

+1

Tôi học được điều gì mới mỗi khi tôi đến đây. Tôi đã không nhận thức được chức năng ValidateModel() - câu trả lời của Jayantha cũng chính xác và dễ dàng hơn nhiều nếu bạn đang sử dụng ASP.Net MVC. Câu trả lời tôi đưa ra sẽ hoạt động bên ngoài ngữ cảnh của một bộ điều khiển. –

+0

Các công trình trên rất độc đáo khi xác thực mô hình mà không gửi biểu mẫu, trong trường hợp đó 'TryValidateModel' không thành công:' Khi một mô hình đang được xác nhận, tất cả các trình xác nhận cho tất cả các thuộc tính đều chạy nếu ít nhất một đầu vào biểu mẫu bị ràng buộc vào một mô hình property.' Từ đây: https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryvalidatemodel(v=vs.118).aspx – Alex

10

bạn có thể sử dụng TryValidateModel hoặc ValidateModel

User u = new User(); 
    u.Username = "test"; 
    u.Password = "test"; 
    u.Email = "test"; 


    if (TryValidateModel(u)) 
    { 

    }else{ 

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