2012-10-04 45 views
38

Tôi bắt đầu với MVC 4 (công cụ xem dao cạo). (Tôi tin rằng điều này có thể áp dụng cho MVC 3 và trước đó nữa.) Tôi tự hỏi nếu có bất kỳ lợi ích nào khi sử dụng chú thích dữ liệu DisplayAttribute trong một khung nhìn so với chỉ viết một chuỗi trực tiếp trong HTML. Ví dụ, nếu tôi đã có mô hình sau:MVC 4 Chú thích dữ liệu "Hiển thị" Thuộc tính

public class Thing 
{ 
    public string WildAndCrazyProperty { get; set; } 
} 

... sẽ có được bất kỳ lợi ích trong việc chú thích bất động sản như:

[Display(Name = "Wild and Crazy")] 
    public string WildAndCrazyProperty { get; set; } 

... và có đánh dấu của tôi là:

<html> 
    <body> 
     <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
     <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
    </body> 
</html> 

... so với không có chú thích, và thực hiện:

<html> 
    <body> 
     <div>Wild and Crazy</div> 
     <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
    </body> 
</html> 

Lý do tôi chưa đề cập đến Html.LabelFor trong trường hợp này là do dữ liệu của thuộc tính đang được hiển thị dưới dạng tĩnh (tức là không thể chỉnh sửa) trên trang. Dữ liệu sẽ không bao giờ được chỉnh sửa trên trang này, vì vậy tôi không cần sử dụng Html.TextBoxFor trong số <div> thứ hai và sau đó sử dụng Html.LabelFor để liên kết nhãn phù hợp với hộp văn bản đó.

Trả lời

45

Nếu hai chế độ xem khác nhau đang chia sẻ cùng một mô hình (ví dụ: có thể một cho đầu ra trên thiết bị di động và một là bình thường), thì có thể có chuỗi ở một nơi duy nhất: siêu dữ liệu trên ViewModel.

Ngoài ra, nếu bạn có phiên bản kế thừa của mô hình cần một màn hình khác, nó có thể hữu ích. Ví dụ:

public class BaseViewModel 
{ 
    [Display(Name = "Basic Name")] 
    public virtual string Name { get; set; } 
} 

public class OtherViewModel : BaseViewModel 
{ 
    [Display(Name = "Customized Inherited Name")] 
    public override string Name { get; set; } 
} 

tôi sẽ thừa nhận rằng ví dụ đó là khá giả tạo ...

Đó là những lý lẽ tốt nhất ủng hộ việc sử dụng thuộc tính mà tôi có thể nghĩ ra. Ý kiến ​​cá nhân của tôi là, đối với hầu hết các phần, đó là loại điều tốt nhất còn lại để đánh dấu.

+4

Và đó là cách tôi đang nghiêng. Có vẻ như bạn sẽ muốn một cái gì đó thực sự là một loại màn hình hiển thị trong phần mã thực hiện hiển thị thực tế. Phải biên dịch lại dự án chỉ để thay đổi một hoặc hai nhóm có vẻ không cần thiết. –

+0

Tôi hoàn toàn đồng ý về điểm biên dịch lại. Tôi cảm thấy ngay cả khi bạn phải sử dụng mô hình trong nhiều chế độ xem, những ưu điểm của việc đưa dữ liệu đó vào một thuộc tính không vượt quá tầm quan trọng. – eouw0o83hf

+2

Vì vậy, tôi thực sự thích khái niệm đằng sau câu trả lời này, nhưng nó không làm việc cho tôi. Lớp kế thừa của tôi không ghi đè thuộc tính 'Hiển thị' của lớp cơ sở. Có lý do gì không? – Kehlan

8

Một trong những lợi ích là bạn có thể sử dụng nó trong nhiều chế độ xem và có văn bản nhãn nhất quán. Nó cũng được sử dụng bởi asp.net MVC giàn giáo để tạo ra các văn bản nhãn và làm cho nó dễ dàng hơn để tạo ra văn bản có ý nghĩa

[Display(Name = "Wild and Crazy")] 
public string WildAndCrazyProperty { get; set; } 

"hoang dã và điên" xuất hiện liên tục mọi lúc mọi nơi sử dụng tài sản trong ứng dụng của bạn.

Đôi khi điều này không linh hoạt vì bạn có thể muốn thay đổi văn bản trong một số giao diện. Trong trường hợp đó, bạn sẽ phải sử dụng đánh dấu tùy chỉnh như trong ví dụ thứ hai

+0

Trong trường hợp này, tôi chỉ có một cái nhìn, vì vậy có lẽ đó là lý do tại sao tôi không thể cảm nhận được một lợi ích. Mặc dù lợi ích này, nó có vẻ như là một trong những có thể có một số lượng lớn các quan điểm sử dụng lại cùng một tài sản này trước khi hậu quả của recompilation sẽ được nhiều hơn bởi lợi ích. –

13

Ngoài các câu trả lời khác, có lợi ích lớn khi sử dụng DisplayAttribute khi bạn muốn bản địa hóa các trường. Bạn có thể tra cứu tên trong cơ sở dữ liệu bản địa hóa bằng cách sử dụng DisplayAttribute và nó sẽ sử dụng bất kỳ bản dịch nào bạn muốn.

Ngoài ra, bạn có thể cho phép MVC tạo mẫu cho bạn bằng cách sử dụng Html.EditorForModel() và nó sẽ tạo nhãn chính xác cho bạn.

Cuối cùng, tùy bạn. Nhưng MVC rất "Model-centric", đó là lý do tại sao các thuộc tính dữ liệu được áp dụng cho các mô hình, do đó siêu dữ liệu tồn tại ở một nơi duy nhất. Nó không giống như nó là một số lượng lớn của gõ thêm bạn phải làm.

+0

Trong trường hợp hiện tại của tôi, ứng dụng chỉ là một thử nghiệm front-end cho một dịch vụ WebAPI. Không cần bản địa hóa; nhưng tôi có thể thấy lợi ích của hành vi như vậy. –

+0

@KennethK. - có rất nhiều thứ có thể không có lợi cho bạn ngay bây giờ, nhưng bạn có thể muốn sau này. Sử dụng kiến ​​trúc 3 tầng có thể không đem lại lợi ích cho bạn bây giờ, nhưng sau đó ... bạn sẽ đập đầu của bạn. Vấn đề là, sử dụng nó hay không .. đó là sự lựa chọn của bạn, nhưng cố gắng không ngụ ý rằng nó vô dụng. –

+0

Nếu tôi tình cờ hiểu được kỹ thuật này là vô ích, tôi chắc chắn không có ý định. Như tôi đã đề cập, ứng dụng chỉ đơn giản là mặt tiền cho dịch vụ web. Không có khả năng ứng dụng được sử dụng ngoài khả năng này. Vì ứng dụng bao gồm chính xác một chế độ xem nên tôi không thể thấy được lợi ích. Bây giờ nếu tôi đang thiết kế một ứng dụng công khai với khán giả toàn cầu, vâng, những gì bạn mô tả có ý nghĩa hoàn hảo. Đó là kích thước của ứng dụng cụ thể này mà không làm rõ lý do tại sao thuộc tính sẽ hữu ích. –

Các vấn đề liên quan