2010-02-11 34 views
9

Tôi đang tạo một trình kết nối mô hình tùy chỉnh trong một ứng dụng Mvc và tôi muốn phân tích một chuỗi thành giá trị điều tra và gán nó cho thuộc tính mô hình. Tôi đã có nó làm việc overriding phương pháp BindProperty, nhưng tôi cũng nhận thấy rằng có một phương pháp SetProperty.Sự khác biệt giữa BindProperty và SetProperty trên IModelBinder

protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
     switch (propertyDescriptor.Name) 
     { 
      case "EnumProperty": 
       BindEnumProperty(controllerContext, bindingContext); 
       break; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

    private static void BindEnumProperty(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var formValue = controllerContext.HttpContext.Request.Form["formValue"]; 

     if (String.IsNullOrEmpty(formValue)) 
     { 
      throw new ArgumentException(); 
     } 

     var model = (MyModel)bindingContext.Model; 
     model.EnumProperty = (EnumType)Enum.Parse(typeof(EnumType), formValue); 
    } 

Tôi không chắc chắn sự khác biệt giữa hai điều gì và liệu tôi có thực hiện điều này theo cách được đề xuất hay không.

Trả lời

6

Trước hết, BindProperty không phải là một phần của IModelBinder mà là một phương thức được bảo vệ trong DefaultModelBinder. Bạn có thể truy cập nó chỉ khi bạn đang phân lớp con DefaultModelBinder.

Những điểm sau đây nên trả lời câu hỏi của bạn:

  • BindProperty sử dụng giao diện IModelBinder nó được từ PropertyType của đối số PropertyDescriptor. Điều này cho phép bạn tiêm tùy chỉnh thuộc tính vào thuộc tính siêu dữ liệu.
  • BindProperty đúng cách xử lý xác thực. Nó (cũng) gọi phương thức SetProperty chỉ khi giá trị mới hợp lệ.

Vì vậy, nếu bạn muốn xác thực hợp lệ (sử dụng thuộc tính chú thích), bạn nhất định phải gọi BindProperty. Bằng cách gọi SetProperty bạn bỏ qua tất cả các cơ chế xác nhận được tích hợp sẵn.

Bạn nên kiểm tra mã nguồn của DefaultModelBinder xem từng phương pháp làm gì, vì phần intellisense chỉ cung cấp thông tin giới hạn.

+0

Nguồn hiện tại http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/DefaultModelBinder.cs – Rob

+0

@Rob URL của bạn không hợp lệ cũng –

+0

@Kilanny, không hợp lệ như thế nào? Nó vẫn có vẻ làm việc cho tôi. – Rob

0

Tôi nghĩ SetProperty có giá trị thực để đặt làm tham số cuối cùng.

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