2012-12-06 28 views
21

Ai đó có thể cho tôi biết các ưu/concs sử dụng thuộc tính [ModelBinder()] so với các mô hình đăng ký qua ModelBinders.Add() trong global.asax?Sử dụng thuộc tính ModelBinder so với ModelBinders.Thêm()

Một lợi thế mà tôi có thể nghĩ là rõ ràng hơn, trong khi đăng ký trong toàn cầu ModelBinders không phải là điều hiển nhiên đối với người kiểm tra phương pháp hành động. Một sự cân bằng mà tôi có thể nghĩ là nó không thể tái sử dụng được, vì bạn sẽ phải thêm thuộc tính này vào tất cả các phương thức hành động cần sử dụng chất kết dính mô hình này, trong khi đăng ký toàn cầu ModelBinders sẽ làm cho nó có sẵn cho tất cả các phương thức hành động nhận được mô hình đó.

Đây có phải là sự khác biệt duy nhất không?

Nói cách khác, sẽ nêu này là đúng:

  • Nếu bạn chỉ sử dụng các mô hình trong một phương pháp hành động (có thể hai, có được + bưu điện), sau đó sử dụng [ModelBinder()].
  • Nếu bạn sử dụng mô hình trong nhiều phương thức hành động, hãy đăng ký mô hình đó trong toàn cầu ModelBinders.

Trả lời

28

Kết quả của những kỹ thuật đó sẽ giống nhau vì vậy, phần lớn là vấn đề mà nhóm cảm thấy thoải mái hơn. Vì vậy, bạn có thể đưa ra một quy ước như quy ước mà bạn đã nêu.

Cá nhân, tôi không muốn đặt thuộc tính trên mọi phương thức hành động sử dụng mô hình đó. Vì vậy, tôi sẽ chọn một trong các tùy chọn sau:

  • Đặt thuộc tính trên lớp mô hình như:

    [ModelBinder(typeof(MyModelBinder))] 
    public class MyModel 
    { 
        ... 
    }  
    
  • toàn cầu đăng ký chất kết dính

    ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder()) 
    

Một lý do khác tại sao tôi thích một trong số đó là vì nếu bạn phải kích hoạt thủ công quá trình ràng buộc mô hình, bạn cũng có thể muốn ur mô hình tùy chỉnh chất kết dính được sử dụng:

public ActionResult SomeActionMethod() 
{ 
    MyModel model = ... 

    //manually invoke the model binding process considering only query string data 
    //The custom model binder will be used only if it was globally registered 
    //in the binders dictionary or set in an attribute of the model class 
    TryUpdateModel(model, new QueryStringValueProvider()) 

    ... 
} 

Bạn cũng có tùy chọn để thực hiện logic riêng của bạn để lựa chọn chất kết dính mô hình bằng cách thực hiện các giao diện IModelBinderProvider và đăng ký trong global.asax như trong

ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider()) 

Một cách để sử dụng thuộc tính trong các tham số của phương thức có thể được ghi đè đối với phương thức cụ thể mà trình mô hình hóa mà nếu không sẽ được sử dụng. Vì vậy, bạn có thể đăng ký một mô hình trên toàn cầu cho lớp của bạn và ghi đè nó trong một phương thức hành động cụ thể bằng cách sử dụng thuộc tính.

Cuối cùng, có một số tùy chọn để chọn trình kết nối mô hình. Trong asp MVC 3 này sẽ được giải quyết theo cách sau (giả sử bạn đang sử dụng mặc định ControllerActionInvoker)

  1. Thuộc tính trên các tham số của hành động.Xem phương thức GetParameterValue của ControllerActionInvoker class

  2. Binder được trả về từ IModelBinderProvider. Xem phương pháp GetBinder trong ModelBinderDictionary class

  3. Binder được đăng ký toàn cầu trong từ điển ModelBinders.Binders.

  4. Chất kết dính được xác định trong thuộc tính [ModelBinder()] cho loại mô hình.

  5. DefaultModelBinder.

+0

Bạn có thể đặt DefaultModelBinder - tiện dụng để gỡ lỗi 'ModelBinders.Binders.DefaultBinder = new TestBinder();' – Todd

0

Dường như với ưu điểm của việc sử dụng thuộc tính hơn là thêm vào bộ sưu tập mô hình liên kết trong Global.asax là bạn có thể nói phương pháp (hoặc lớp) sử dụng chất kết dính cụ thể hơn là kết hợp chất kết dính với một loại cụ thể. Sau đó, bạn có thể tạo mô hình dựa trên ngữ cảnh thay vì một loại.

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