2011-12-07 33 views
7

Tôi đã tạo mẫu Trình chỉnh sửa tùy chỉnh và Mẫu hiển thị. Tôi đã đặt từng loại này trong một thư mục trong thư mục lượt xem của mình. Các thư mục được đặt tên là EditorTemplate hoặc DisplayTemplate, tùy thuộc vào loại mẫu đã được tạo.MVC3 Hiển thị mẫu

Vì vậy, bây giờ tôi có thể sử dụng EditorFor để sử dụng mẫu trình chỉnh sửa tùy chỉnh của tôi hoặc DisplayFor cho mẫu trình chỉnh sửa tùy chỉnh của tôi.

Tôi muốn tạo mẫu tùy chỉnh cho LabelFor, nhưng tôi chưa tìm thấy ví dụ về điều này. Tôi sẽ tạo một thư mục có tên Labeltemplate trong thư mục Views của tôi và thêm nó vào đây?

CẬP NHẬT

Lý do tôi đã cố gắng để mở rộng LabelFor là để xử lý một tài sản đó là của kiểu KeyValuePair. Tôi muốn sử dụng Khóa của thuộc tính này làm Nhãn và giá trị là Hiển thị. Tôi đã đặt câu hỏi here về DisplayFor để xử lý Giá trị.

Giải pháp của tôi đã kết thúc như>

@Html.DisplayFor(m => m.MyProperty, @Model.MyProperty.Key) 

Cảm ơn,

Trả lời

6

LabelFor không sử dụng bất kỳ mẫu. Nó được hardcoded trong mã nguồn MVC và nó spits một <label> không có vấn đề gì bạn làm.

Bạn sẽ phải viết trình trợ giúp html tùy chỉnh nếu bạn muốn sửa đổi hành vi này.

Mặt khác, nếu bạn muốn sử dụng mẫu, bạn phải sử dụng trình trợ giúp EditorFor/DisplayFor. Vì vậy, vì nhãn là để hiển thị mục đích, bạn có thể sử dụng mẫu hiển thị và thay vì sử dụng Html.LabelFor(x => x.Foo) hãy sử dụng Html.DisplayFor(x => x.Foo). Theo như mẫu tùy chỉnh, bạn có thể trang trí thuộc tính Foo với thuộc tính [UIHint] hoặc chuyển nó làm đối số thứ hai cho trình trợ giúp DisplayFor.


UPDATE:

Theo bình luận của bạn, bạn không cố gắng để sửa đổi đánh dấu nhưng chỉ có giá trị. Đó là những gì đối số thứ hai của helper LabelFor có thể được sử dụng cho:

@Html.LabelFor(x => x.Foo, Model.Key) 
@Html.EditorFor(x => x.Foo) 

Điều này tạo ra một nhãn hiệu được kết hợp với đầu vào Foo (for thuộc tính của nhãn được gán đúng) nhưng nội dung thể hiện là của Key thuộc tính trên mô hình chế độ xem của bạn.

+0

Tôi tốt với nhãn, nhưng tôi muốn thiết lập văn bản bên trong của nhãn đến một giá trị khác hơn những gì người trợ giúp sử dụng. Thuộc tính của tôi là một keyvaluepair và tôi muốn đặt nhãn thành 'Key' của thuộc tính. Có suy nghĩ gì không? –

+0

Hãy cẩn thận khi sử dụng "DisplayFor". Giải pháp của bạn sẽ hoạt động nhưng DisplayFor được dự định sẽ được sử dụng để tạo hiển thị "chỉ đọc" của một giá trị chứ không phải để tạo nhãn cho thuộc tính. Bằng cách này, tôi có nghĩa là một DisplayFor cho "DateTime" sẽ được sử dụng để tùy chỉnh định dạng thời gian dữ liệu được hiển thị. Mẫu "DisplayFor" cho mô hình hoặc lớp tùy chỉnh của bạn sẽ tạo ra giá trị. –

+0

Có lẽ tôi sẽ chỉ viết mã cứng nhãn, và không sử dụng trợ giúp nào cả. –

2

Không có hỗ trợ cho việc tạo mẫu cho phương thức trình trợ giúp HTML cụ thể (LabelFor).

Bạn có thể:

Markup mô hình của bạn sử dụng mô tả meta để thay đổi những gì giá trị được hiển thị như một phần của nhãn:

[DisplayName("Custom Label")] 
public string Test {get;set;} 

Bạn có thể tạo tùy chỉnh phương pháp trợ giúp HTML của riêng bạn cho xé ra một nhãn :

How can I override the @Html.LabelFor template?

+0

Tôi đã thử giải pháp được cung cấp trong câu hỏi đó, nhưng tôi cần giá trị 'Key' từ thuộc tính KeyValuePair của mình. Câu hỏi của ông được giải quyết với định dạng của nhãn (thêm một thẻ span). –

+0

Mã trong bài đăng đó không phải là "giải pháp cuối cùng" cho bạn, nó không có nghĩa là cung cấp cho bạn mã cơ bản để tạo Trình trợ giúp HTML có thể làm những gì bạn muốn. –

+0

Nó đã cho tôi những điều cơ bản, nhưng thiếu một yếu tố quan trọng, giá trị của tài sản. Dường như mã chỉ hoạt động với siêu dữ liệu của thuộc tính, nhưng không phải là giá trị. Đó là tất cả những gì tôi thực sự cần, nhưng không chắc liệu nó có sẵn hay không. –

1

Bạn có thể tạo một DisplayTemplate và truy cập nó thông qua mẫu tên:

@Html.DisplayFor(x => x.Foo, "label") 

Và sau đó chỉ cần tạo mẫu có tên label.cshtml trong thư mục DisplayTemplates của bạn.

Để đơn giản hóa cuộc gọi này, bạn có thể viết một phương pháp mở rộng để xử lý cuộc gọi này:

public static MvcHtmlString TemplateLabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> property) 
{ 
    return html.DisplayFor(property, "label"); 
} 
Các vấn đề liên quan