2012-10-04 1 views
38

Я начинаю работать с MVC 4 (движок просмотра Razor). (Я считаю, что это может относиться и к MVC 3 и более ранним.) Мне интересно, есть ли какая-либо польза от использования аннотации данных DisplayAttribute в представлении, а не только для написания строки непосредственно в HTML. Например, если бы я имел следующую модель:MVC 4 Data Annotations "Display" Атрибут

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

... будет ли какая-либо выгода в аннотировании собственности как:

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

... и имеющей быть моя разметка:

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

... против не имея аннотацию и делать:

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

Причина, по которой я не упомянул Html.LabelFor, в этом случае заключается в том, что данные свойства отображаются как статические (т. не редактируемый) текст на странице. Данные никогда не будут редактироваться на этой странице, поэтому мне не нужно использовать Html.TextBoxFor во втором <div> и затем использовать Html.LabelFor, чтобы правильно связать метку с этим текстовым полем.

ответ

45

Если два разных вида разделяют одну и ту же модель (например, может быть, один для мобильного вывода и один является обычным), было бы неплохо иметь строку в одном месте: метаданные в ViewModel.

Кроме того, если у вас есть унаследованная версия модели, которая потребовала другого дисплея, это может быть полезно. Например:

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; } 
} 

Я признаю, что этот пример довольно надуманный ...

Это лучшие аргументы в пользу использования атрибута, что я могу придумать. Мое личное мнение состоит в том, что, по большей части, такого рода вещи лучше всего оставлять на разметке.

+4

И так я склоняюсь. Кажется, что вам нужно что-то, что действительно больше похоже на тип отображения в той части кода, которая делает фактическое отображение. Необходимость перекомпилировать проект просто изменить заголовок или два кажется ненужным. –

+0

Я полностью согласен с точкой перекомпиляции. Я чувствую, что даже если вам приходилось использовать модель в нескольких представлениях, плюсы на то, что эти данные в атрибуте не перевешивают минусы. – eouw0o83hf

+2

Так что мне очень нравится концепция этого ответа, но для меня это не работает. Мой класс наследования не переопределяет атрибут 'Display' базового класса. Почему? – Kehlan

8

Одним из преимуществ является то, что вы можете использовать его в нескольких представлениях и иметь согласованный текст ярлыка. Он также используется ASP.NET MVC подмостей для создания текстовых меток и делает его легче генерировать осмысленный текст

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

«Дикие и Сумасшедшие» показывается последовательно, где используется свойство в вашем приложении.

Иногда это не является гибким, поскольку вы можете изменить текст в некотором представлении. В этом случае вам придется использовать специальную разметку, как в вашем втором примере

+0

В этом случае у меня есть только один вид, поэтому, возможно, именно поэтому я не мог понять выгоды. Несмотря на это преимущество, кажется, что можно было бы иметь большее количество просмотров, повторно использующих это же свойство, прежде чем последствия перекомпиляции будут перевешиваться выгодой. –

13

В дополнение к другим ответам, есть большая польза от использования DisplayAttribute, если вы хотите локализовать поля. Вы можете найти имя в базе данных локализации с помощью DisplayAttribute и использовать любой перевод.

Кроме того, вы можете позволить MVC генерировать шаблоны для вас, используя Html.EditorForModel(), и он будет генерировать правильный ярлык для вас.

В конечном счете, это зависит от вас. Но MVC очень «ориентирован на модель», поэтому атрибуты данных применяются к моделям, поэтому метаданные существуют в одном месте. Это не похоже на то, что вам нужно много лишнего набора текста.

+0

В моем текущем случае приложение является просто тестовым интерфейсом для службы WebAPI. Не требуется локализация; но я вижу преимущества такого поведения. –

+0

@ KennethK. - Есть много вещей, которые могут не принести вам пользу прямо сейчас, но вы можете пожелать, чтобы вы сделали это позже. Использование трехуровневой архитектуры может не принести вам пользы, но позже ... вы будете ударять головой. Дело в том, используйте это или нет .. это ваш выбор, но старайтесь не подразумевать, что это бесполезно. –

+0

Если бы я столкнулся с тем, что техника была бесполезной, я, конечно же, не собирался. Как я уже упоминал, приложение просто фасад веб-службы. Нет возможности использовать приложение вне этой возможности. Поскольку приложение состоит всего из одного представления, я не мог видеть выгоды. Теперь, если бы я разрабатывал публичное приложение с глобальной аудиторией, да, то, что вы описываете, имеет смысл. Это размер этого конкретного приложения, который не дал понять, почему этот атрибут будет полезен. –

Смежные вопросы