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.
This Display attribute expects a named parameter and here we want to change the display name of the property from EmployeeName to Employee Name. Display(Name="Employee Name")] public string EmployeeName { get; set; }
Data annotation attributes are attached to the properties of the model class and enforce some validation criteria. They are capable of performing validation on the server side as well as on the client side. This article discusses the basics of using these attributes in an ASP.NET MVC application.
DataAnnotations Namespace. Provides attribute classes that are used to define metadata for ASP.NET MVC and ASP.NET data controls.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With