Mặc địnhModelBinder hiển thị phương thức công khai: DefaultModelBinder.BindModel và một số phương pháp được bảo vệ có sẵn để ghi đè. Tất cả chúng được liệt kê here.
Bên cạnh những mô hình, những phương pháp đề cập đến thuộc tính duy nhất, không lĩnh vực, như
- GetModelProperties,
- GetFilteredModelProperties,
- GetPropertyValue,
- OnXYZValidating,
- OnXYZValidated,
- OnXYZUpdating,
- OnXYZUpdated,
- GetXYZValue,
nơi XYZ
là viết tắt của một trong hai Model,
hoặc Property/ies,
hoặc cả hai, và vân vân.
Như bạn có thể thấy không có Fields
được đề cập với những tên này. Như Darin giải thích không có thay đổi trực tiếp nào về trạng thái của Mô hình được dung sai bởi Binder. Do đó không có Field
trong các phương pháp của nó.
Và cũng có thể, bạn có thể muốn xem một lớp quan trọng khác: ModelBindingContext. Một thể hiện của lớp này được chuyển đến BindModel,
và sau đó đến BindSimpleModel,
và BindComplexModel,
tùy thuộc vào loại mô hình (string, int,
... được coi là đơn giản, mọi thứ khác đều phức tạp).
Vì vậy, bối cảnh này có các thuộc tính sau:
- ModelXYZ, và
- PropertyXYZ.
Nói cách khác bạn không có phương tiện để tham khảo các trường trong ViewModel của bạn trừ khi bạn không ghi đè các lớp này và thực hiện các hành động đặc biệt để làm như vậy.
Nhưng một lần nữa, hãy cẩn thận khi chiến đấu với khung làm việc, thay vào đó luôn dễ dàng theo dõi nó hơn.
EDIT: Lớp ModelMetadata giữ tất cả dữ liệu cần thiết để ràng buộc mô hình. Mã của nó tuy nhiên, cho thấy không có dấu hiệu của các lĩnh vực, tên trường, vv Chỉ có tài sản được tham chiếu và truy cập. Vì vậy, ngay cả khi bạn cố gắng kế thừa và ghi đè DefaultModelBinder và ModelBinderContext, bạn vẫn sẽ không thể truy cập vào các bộ lọc, không bao giờ biết công cụ sửa đổi truy cập của họ là gì: công khai, riêng tư, v.v.
Hy vọng điều này giải thích hầu hết.
Ok, nhưng để bạn có các công cụ sửa đổi truy cập. Nếu tôi không muốn một lĩnh vực được thiết lập trực tiếp, tôi chỉ cần khai báo nó là 'private'. Các lớp ViewModel thường chỉ là các datacontainer và hầu hết không chứa nhiều logic - vì vậy tôi nghĩ rằng nó có thể là ok để chỉ sử dụng các trường công khai. – Jan
@Jan, các trường thông thường phải là riêng tư. –
Và thông thường bạn không nên có logic trong getters của tài sản ... – gdoron