2011-01-31 48 views
8

Đây là một hành động điều khiển mà tôi gọi với ajax bài phương pháp:Làm cách nào để cập nhật ModelState?

[HttpPost] 
    public ActionResult Add(Comment comment) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 

Nếu người dùng đang đăng nhập, nộp mẫu đơn không có tên người dùng và Email lĩnh vực, vì vậy họ không có được thông qua bằng cách gọi ajax . Khi hành động được gọi là ModelStat.IsValid trả về false, vì hai thuộc tính này là bắt buộc. Sau khi tôi đặt giá trị hợp lệ cho thuộc tính, làm cách nào để kích hoạt xác thực mô hình để cập nhật ModelState?

Trả lời

4

Bạn có thể sử dụng một tùy chỉnh model binder để ràng buộc Tên và Email thuộc tính của bình luận từ User.Identity. Bởi vì ràng buộc xảy ra trước khi xác nhận ModelState sẽ hợp lệ sau đó.

Tùy chọn khác là triển khai model validator tùy chỉnh cho lớp Nhận xét, kiểm tra ControllerContext.Controller cho người dùng đã được xác thực.

Bằng cách triển khai bất kỳ tùy chọn nào trong số các tùy chọn này, bạn có thể xóa tùy chọn đầu tiên nếu kiểm tra.

+0

Tôi sợ rằng nó sẽ đến đó. Bất kỳ giải pháp nào khác? – frennky

+1

Đừng sợ, đó là những giải pháp sạch nhất, "hầu hết các MVC". Bằng cách áp dụng chúng, bạn cũng sẽ tìm hiểu thêm một chút về khung công tác mà bạn đang làm việc. – m0sa

+0

Vâng, tôi biết. Tôi chỉ nhảy để giữ nó đơn giản. Tôi đã triển khai trình kết nối mô hình tùy chỉnh, theo cách đó tôi đã tiếp tục xác thực. Cảm ơn bạn đã chỉ cho tôi đúng hướng. – frennky

3

Bạn có thể thử gọi phương thức được xây dựng theo phương pháp TryUpdateModel trả về boolean để bạn có thể kiểm tra giá trị đó.

CẬP NHẬT: Thử sử dụng TryUpdateModel với ngoại lệ. Sử dụng một formcollection thay vì Comment vào Action.

[HttpPost] 
    public ActionResult Add(FormCollection collection) 
    { 

     string[] excludedProperties = new string[] { "Username". "Email" }; 
     var comment = new Comment(); 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     TryUpdateModel<Comment>(comment, "", null, excludedProperties, collection.ToValueProvider()); 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 
+0

Không, đó là điều đầu tiên tôi đã thử và tất cả các phương pháp khác trong bộ điều khiển: UpdateModel, ValidateModel, TryValidate. Không có gì trong số đó hoạt động, tôi nhận được một ngoại lệ: Mô hình không thể được cập nhật/xác nhận hoặc somthing tương tự. – frennky

+0

Trong trường hợp đó, tại sao không sử dụng ViewModel? Điều này sẽ bao gồm tất cả các thuộc tính bạn thực hiện cho Hành động và không cần phải lo lắng về các thuộc tính còn thiếu. – Jon

+0

Hãy thử một viewmodel hoặc thử đề nghị cập nhật trong câu trả lời của tôi – Jon

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