MVC 4 Data Annotations "Display" Attribute
I am starting out with MVC 4 (Razor view engine). (I believe this may apply to MVC 3 and earlier as well.) I am wondering if there is any benefit to using the DisplayAttribute data annotation within a view versus just writing a string directly in the HTML. For example, if I had the following model:
public class Thing
{
public string WildAndCrazyProperty { get; set; }
}
...would there be any benefit in annotating the property as:
[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }
...and having my markup be:
<html>
<body>
<div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div>
<div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
</body>
</html>
...versus not having the annotation, and doing:
<html>
<body>
<div>Wild and Crazy</div>
<div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
</body>
</html>
The reason I haven't mentioned Html.LabelFor
in this case is because the property's data is being displayed as static (i.e. non-editable) text on the page. The data will never be editable on this page, so there is no need for me to use Html.TextBoxFor
within the second <div> and subsequently use the Html.LabelFor
to properly associate a label with that text box.
If two different views are sharing the same model (for instance, maybe one is for mobile output and one is regular), it could be nice to have the string reside in a single place: as metadata on the ViewModel.
Additionally, if you had an inherited version of the model that necessitated a different display, it could be useful. For instance:
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; }
}
I'll admit that that example is pretty contrived...
Those are the best arguments in favor of using the attribute that I can come up with. My personal opinion is that, for the most part, that sort of thing is best left to the markup.
In addition to the other answers, there is a big benefit to using the DisplayAttribute
when you want to localize the fields. You can lookup the name in a localization database using the DisplayAttribute and it will use whatever translation you wish.
Also, you can let MVC generate the templates for you by using Html.EditorForModel()
and it will generate the correct label for you.
Ultimately, it's up to you. But the MVC is very "Model-centric", which is why data attributes are applied to models, so that metadata exists in a single place. It's not like it's a huge amount of extra typing you have to do.
One of the benefits is you can use it in multiple views and have a consistent label text. It is also used by asp.net MVC scaffolding to generate the labels text and makes it easier to generate meaningful text
[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }
"Wild and Crazy" shows up consistently wherever you use the property in your application.
Sometimes this is not flexible as you might want to change the text in some view. In that case, you will have to use custom markup like in your second example