Ít nhất, tôi nghĩ điều đó có liên quan đến vấn đề. Kịch bản của tôi là:
Tôi có một số thực thể kinh doanh có các trường phổ biến và mỗi thực thể có các trường tùy chỉnh duy nhất cho thực thể đó. Vì vậy, trong mã, nó được mô hình hóa như một EntityBase
lớp và có một số lớp bắt nguồn từ nó, ví dụ Derived
,.
Để tạo giao diện người dùng có thể tái sử dụng, tôi có một chế độ xem có tên EntityBase.vbhtml
như sau:
@ModelType EntityBase
@Using Html.BeginForm("Edit", Model.GetType.Name)
@* show the editor template for the derived type *@
@* !!the next line renders nothing!! *@
@Html.EditorFor(Function(x) Model, Model.GetType.Name)
[show a bunch of stuff common to all EntityBase objects]
End Using
và sau đó người ta gọi Derived.vbhtml
các lớp dẫn xuất thực hiện điều này:
@ModelType Derived
[show an EditorFor for various Derived-specific fields]
Sau đó, khi bạn điều hướng đến \Derived\Edit\123
, nó sẽ trả về chế độ xem mặc định Derived\Edit.vbhtml
, chỉ thực hiện điều này:
@Html.EditorForModel("EntityBase")
Bằng cách này, bộ điều khiển chỉ trả lại dạng xem Chỉnh sửa mặc định dự kiến, là một lệnh gọi một lớp tới dạng EntityBase
xem, nó thực hiện nhiệm vụ của nó và gọi Derived
để hiển thị nội dung lớp dẫn xuất mà nó không biết.
Tôi nghĩ rằng điều này là không đáng kể, nhưng nó không hoạt động. Như được đánh dấu trong mã chế độ xem, khi tôi gọi EditorForModel trong chế độ xem lớp cơ sở, chỉ định tên của lớp dẫn xuất để sử dụng làm mẫu, nó không hiển thị bất kỳ thứ gì. Tôi đã kiểm tra rằng nếu tôi gọi chính xác dòng mã này trong mẫu Chỉnh sửa cấp cao nhất, thì nó hoạt động tốt. Vì vậy, có điều gì đó về sự kế thừa mà MVC không thích, nhưng tôi không thể thấy những gì. Hãy giúp tôi!
Cập nhật : Nó hoạt động như tôi mong đợi nếu thay vì EditorFor
tôi sử dụng Partial
(và di chuyển mẫu tương ứng sang thư mục Chia sẻ từ thư mục EditorTemplates), nhưng đó không phải là một giải pháp tuyệt vời vì tôi nghĩ thật khó hiểu khi không tuân theo quy ước đặt tên cho các mẫu EditorFor.