Helpex - Trao đổi & giúp đỡ Đăng nhập
6

Í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 EntityBaselớ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.vbhtmlnhư 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.vbhtmlcá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 EntityBasexem, 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ì EditorFortô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.

6 hữu ích 0 bình luận 2.6k xem chia sẻ
3

Có vẻ như MVC sẽ không tìm thấy mẫu được đặt tên trong trường hợp này, nhưng nó sẽ tìm thấy nó nếu bạn chỉ định đường dẫn đầy đủ đến mẫu. Vì vậy, thay vì chống lại điều này nữa, tôi đã triển khai chức năng trợ giúp sau:

<Extension()> _
Public Function EditorForObject(Of T, TValue)(ByVal htmlHelper As HtmlHelper(Of T), ByVal obj As TValue) As IHtmlString
    Dim sTemplateName = "~/Views/Shared/EditorTemplates/" & obj.GetType.Name & ".vbhtml"

    'Return htmlHelper.EditorFor(Function(x) obj) <-- this should work but doesn't
    Return htmlHelper.Partial(sTemplateName, obj)
End Function

Trong tiếng Anh, điều này có nghĩa là: hỏi đối tượng cho tên kiểu của nó, tạo đường dẫn rõ ràng đến mẫu trình soạn thảo cho kiểu đó, sau đó gọi HtmlHelper.Partial, chỉ định đối tượng và đường dẫn đầy đủ đến mẫu. Tôi chắc rằng điều này có thể chung chung hơn (và không được mã hóa cứng cho vb), nhưng nó hoạt động.

Sau đó, cách sử dụng là như thế này:

@Html.EditorForObject(Model)

và trên thực tế, điều này thậm chí còn tốt hơn những gì tôi đang cố gắng làm, điều này còn lộn xộn hơn nhiều:

@Html.EditorFor(Function(x) Model, Model.GetType.Name)

Ngay cả khi không gặp vấn đề về tra cứu mẫu, điều này sẽ rất hữu ích, bởi vì nó thuận tiện để có thể chuyển một đối tượng để chỉnh sửa (hoặc hiển thị), hơn là một lambda giả chỉ trả về đối tượng đó.

Tuy nhiên, tôi nghĩ rằng vấn đề tra cứu phải là một lỗi trong MVC. (Nếu tôi có thời gian, tôi đoán tôi có thể kiểm tra mã nguồn.) Ai có thể xác nhận hoặc nhận xét về điều này?

3 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ asp.net mvc vb.net asp.net-mvc-3 razor editorformodel , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading