ASP.NET MVC 3 - Một phần so với mẫu hiển thị so với mẫu biên tập


303

Vì vậy, tiêu đề nên nói cho chính nó.

Để tạo các thành phần có thể sử dụng lại trong ASP.NET MVC, chúng tôi có 3 tùy chọn (có thể là các tùy chọn khác mà tôi chưa đề cập):

Tầm nhìn hạn chế:

@Html.Partial(Model.Foo, "SomePartial")

Mẫu biên tập tùy chỉnh:

@Html.EditorFor(model => model.Foo)

Mẫu hiển thị tùy chỉnh:

@Html.DisplayFor(model => model.Foo)

Về mặt Chế độ xem / HTML thực tế, cả ba triển khai đều giống nhau:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

Vì vậy, câu hỏi của tôi là - khi nào / làm thế nào để bạn quyết định sử dụng một trong ba?

Điều tôi thực sự đang tìm kiếm là một danh sách các câu hỏi để tự hỏi mình trước khi tạo một câu hỏi, trong đó câu trả lời có thể được sử dụng để quyết định sử dụng mẫu nào.

Đây là 2 điều tôi thấy tốt hơn với EditorFor / DisplayFor:

  1. Chúng tôn trọng hệ thống phân cấp mô hình khi kết xuất trình trợ giúp HTML (ví dụ: nếu bạn có đối tượng "Bar" trên mô hình "Foo" của mình, các phần tử HTML cho "Bar" sẽ được hiển thị bằng "Foo.Bar.EuityName", trong khi một phần sẽ có " Tên phần tử ").

  2. Mạnh mẽ hơn, ví dụ nếu bạn có một List<T>thứ gì đó trong ViewModel, bạn có thể sử dụng @Html.DisplayFor(model => model.CollectionOfFoo)và MVC đủ thông minh để xem đó là một bộ sưu tập và hiển thị màn hình duy nhất cho mỗi mục (trái ngược với Partial, yêu cầu rõ ràng cho vòng).

Tôi cũng đã nghe DisplayFor biểu hiện một mẫu "chỉ đọc", nhưng tôi không hiểu điều đó - tôi không thể ném một biểu mẫu lên đó chứ?

Ai đó có thể cho tôi biết một số lý do khác? Có một danh sách / bài viết ở đâu đó so sánh ba?


Các khái niệm đằng sau các mẫu trình soạn thảo và hiển thị được xác định rõ ràng trong tài liệu cho asp.net mvc 2. Mẫu là các phần tuân theo một quy ước cụ thể. Các tình huống làm cho các mẫu tốt hơn hoặc xấu hơn các phần cũ là hầu như hoàn toàn phụ thuộc vào việc liệu quy ước có đáng để tuân thủ trong ứng dụng của bạn hay không.
Nick Larsen

Câu trả lời:


301

EditorForvs DisplayForlà đơn giản. Các ngữ nghĩa của các phương thức là tạo các khung nhìn chỉnh sửa / chèn và hiển thị / chỉ đọc (tương ứng). Sử dụng DisplayForkhi hiển thị dữ liệu (nghĩa là khi bạn tạo div và spans có chứa các giá trị mô hình). Sử dụng EditorForkhi chỉnh sửa / chèn dữ liệu (nghĩa là khi bạn tạo thẻ đầu vào bên trong một biểu mẫu).

Các phương pháp trên là mô hình trung tâm. Điều này có nghĩa là họ sẽ tính đến siêu dữ liệu mô hình (ví dụ: bạn có thể chú thích lớp mô hình của mình với [UIHintAttribute]hoặc [DisplayAttribute]điều này sẽ ảnh hưởng đến mẫu nào được chọn để tạo UI cho mô hình. Chúng cũng thường được sử dụng cho các mô hình dữ liệu (ví dụ như các mô hình đại diện cho các hàng trong cơ sở dữ liệu, v.v.)

Mặt khác, Partialquan điểm là trung tâm ở chỗ bạn chủ yếu quan tâm đến việc chọn chế độ xem một phần chính xác. Khung nhìn không nhất thiết cần một mô hình để hoạt động chính xác. Nó chỉ có thể có một bộ đánh dấu chung được sử dụng lại trên toàn trang web. Tất nhiên thường thì bạn muốn ảnh hưởng đến hành vi của phần này trong trường hợp bạn có thể muốn vượt qua trong một mô hình chế độ xem phù hợp.

Bạn đã không hỏi về @Html.Actioncái nào cũng xứng đáng được đề cập ở đây. Bạn có thể nghĩ về nó như một phiên bản mạnh mẽ hơn Partialở chỗ nó thực thi một hành động con điều khiển và sau đó hiển thị một khung nhìn (thường là một khung nhìn một phần). Điều này rất quan trọng vì hành động con có thể thực thi logic nghiệp vụ bổ sung không thuộc về chế độ xem một phần. Ví dụ, nó có thể đại diện cho một thành phần giỏ hàng. Lý do để sử dụng nó là để tránh thực hiện các công việc liên quan đến giỏ hàng trong mọi bộ điều khiển trong ứng dụng của bạn.

Cuối cùng, sự lựa chọn phụ thuộc vào những gì bạn đang mô hình hóa trong ứng dụng của bạn. Cũng nên nhớ rằng bạn có thể trộn và kết hợp. Ví dụ, bạn có thể có chế độ xem một phần gọi trình EditorFortrợ giúp. Nó thực sự phụ thuộc vào ứng dụng của bạn là gì và làm thế nào để tạo ra nó để khuyến khích tái sử dụng mã tối đa trong khi tránh sự lặp lại.


4
Đó là một câu trả lời tuyệt vời, chính xác những gì tôi đang tìm kiếm. Trong thực tế, tôi đã ngân hàng về thực tế bạn đến và trả lời điều này. :) Cảm ơn marcin.
RPM1984

Làm thế nào để bạn sử dụng các chú thích để chỉ định một mẫu hiển thị và một mẫu biên tập cho một thuộc tính?
bão

3
@stormwild sử dụng quy ước và đặt tên cho các mẫu của bạn theo mô hình mà chúng liên quan đến (/Views/DisplayTemsheet/MyModel.cshtml) hoặc ép buộc rõ ràng với chú thích UIHint.
Tom Wayon

Bạn có lời khuyên nào để chọn để tạo thuật sĩ "người dùng đăng ký" có thể sử dụng lại không? Tôi muốn tạo các khung nhìn này (và bộ điều khiển) trong một hội đồng riêng nếu có thể. Aka, một cách để phân phối lại giữa một số nhóm các biểu mẫu / bộ điều khiển mvc có thể thay đổi này. (chúng tôi đã tạo một cách duy nhất để xử lý người dùng / lưu trữ (dịch vụ webapi) ... nhưng mỗi nhóm đang tạo các trang mvc của riêng họ: <Cảm ơn.
granadaCoder

Nơi nào bạn lưu trữ những mẫu đó? Tôi có cần lưu trữ chúng trong Shared / EditorTemsheet hay có thể lưu trữ chúng trực tiếp trong thư mục bộ điều khiển hiện tại (khi tôi chỉ cần chúng ở đó)?
Santhos

15

Bạn chắc chắn có thể tùy chỉnh DisplayForđể hiển thị một hình thức có thể chỉnh sửa. Nhưng quy ước là DisplayForđể được readonlyEditorForđược chỉnh sửa. Bám sát quy ước sẽ đảm bảo rằng bất kể bạn đi vào vấn đề gì DisplayFor, nó sẽ làm cùng một loại điều.


2
Tôi không nghĩ thực sự có bất kỳ câu hỏi / nghi ngờ nào về việc khi nào nên sử dụng mẫu hiển thị so với mẫu trình soạn thảo. Câu hỏi thực sự xuất hiện là khi nào bạn nên sử dụng các mẫu so với partials. Câu trả lời của bạn hoàn toàn bỏ lỡ điều này.
Joshua Hayes

19
@Joshua - Tôi nghĩ rằng có một số câu hỏi về điều đó: "Tôi cũng đã nghe DisplayFor biểu hiện một mẫu" chỉ đọc ", nhưng tôi không hiểu điều đó - tôi có thể ném một biểu mẫu lên đó không?"
Robert Levy

13

Chỉ để cung cấp giá trị 2c của tôi, dự án của chúng tôi đang sử dụng chế độ xem một phần với một số tab jQuery và mỗi tab hiển thị các trường của nó với chế độ xem một phần của chính nó. Điều này hoạt động tốt cho đến khi chúng tôi thêm một tính năng theo đó một số tab chia sẻ một số trường phổ biến. Cách tiếp cận đầu tiên của chúng tôi là tạo ra một chế độ xem một phần khác với các trường phổ biến này, nhưng điều này trở nên rất khó hiểu khi sử dụng EditorFor và DropDownListFor để kết xuất các trường và thả xuống. Để có được id và tên duy nhất, chúng tôi phải kết xuất các trường có tiền tố tùy thuộc vào chế độ xem một phần cha mẹ đã hiển thị nó:

    <div id="div-@(idPrefix)2" class="toHide-@(idPrefix)" style="display:none">
    <fieldset>
        <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label>

        <input name="@(idPrefix).Frequency"
               id="@(idPrefix)_Frequency"
               style="width: 50%;"
               type="text"
               value="@(defaultTimePoint.Frequency)"
               data-bind="value: viewState.@(viewStatePrefix).RecurringTimepoints.Frequency"
               data-val="true"
               data-val-required="The Frequency field is required."
               data-val-number="The field Frequency must be a number."
               data-val-range-min="1"
               data-val-range-max="24"
               data-val-range="The field Frequency must be between 1 and 24."
               data-val-ignore="true"/>

        @Html.ValidationMessage(idPrefix + ".Frequency")

        ... etc

    </fieldset>
</div>

Điều này trở nên khá xấu xí, vì vậy chúng tôi đã quyết định sử dụng Trình chỉnh sửa Mẫu thay thế, công việc này gọn gàng hơn nhiều. Chúng tôi đã thêm Mô hình Chế độ xem mới với các trường chung, thêm Mẫu Trình chỉnh sửa phù hợp và hiển thị các trường bằng Mẫu Trình chỉnh sửa từ các chế độ xem khác nhau. Mẫu biên tập sẽ hiển thị chính xác id và tên.

Vì vậy, trong ngắn hạn, một lý do thuyết phục để chúng tôi sử dụng Trình chỉnh sửa Mẫu là nhu cầu hiển thị một số trường phổ biến trong nhiều tab. Chế độ xem một phần không được thiết kế cho việc này nhưng Mẫu biên tập xử lý tình huống hoàn hảo.


1
Tôi đã có một vấn đề tương tự sử dụng các tab và kết thúc bằng BeginCollectionItem Steve Sanderson của mà tạo ra id kiểm soát độc đáo ấy dành cho bạn: blog.stevensanderson.com/2010/01/28/...
Wilky

1

Sử dụng _partialphương pháp xem nếu:

  1. Xem logic trung tâm
  2. Điều gì để giữ tất cả các _partialchế độ xem HTML liên quan chỉ trong chế độ xem này. Trong phương thức mẫu, bạn sẽ phải giữ một số HTML bên ngoài Chế độ xem mẫu như "Tiêu đề chính hoặc bất kỳ đường viền / cài đặt bên ngoài nào.
  3. Muốn hiển thị chế độ xem một phần bằng logic (Từ bộ điều khiển) bằng cách sử dụng URL.Action("action","controller").

Lý do nên sử dụng Mẫu:

  1. Muốn gỡ ForEach(Iterator). Mẫu cũng đủ để xác định Model là một loại danh sách. Nó sẽ làm điều đó tự động.
  2. Mô hình logic trung tâm. Nếu nhiều chế độ xem được tìm thấy trong cùng một thư mục Mẫu cho hiển thị, thì kết xuất sẽ phụ thuộc vào Mô hình đã qua.

1

Một sự khác biệt khác chưa được đề cập cho đến nay là một phần xem không thêm tiền tố mô hình trong khi một mẫu có Đây là vấn đề

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.