Minsk Minsk - 3 months ago 21
ASP.NET (C#) Question

What is a simple explanation for displayfor and displaynamefor in asp.net?

I have a class

public class Item
{
public int ItemId { get; set; }

[Required(ErrorMessage = "Category is required")]
[Range(1, int.MaxValue, ErrorMessage = "Category is required")]
public int CategoryId { get; set; }

[Display(Name = "Current password")]
[Required(ErrorMessage = "Name is required")]
[StringLength(160)]
public string Name { get; set; }

[Required(ErrorMessage = "Price is required")]
[Range(0.01, 100.00,
ErrorMessage = "Price must be between 0.01 and 100.00")]
public decimal Price { get; set; }

public virtual Category Category { get; set; }
}


In my controller I pass an instance of this to view

public ActionResult Index()
{
var model = new Item
{
CategoryId = 1,
Name = "aaa",
Price = 2
};

return View("Index", model);
}


then in view I try to display name using

@model GenericShop.Models.Item

<p>
@Html.DisplayNameFor(m => m.Name)
</p>


and get the following error


Compiler Error Message: CS1061:
'System.Web.Mvc.HtmlHelper' does not contain
a definition for 'DisplayNameFor' and no extension method
'DisplayNameFor' accepting a first argument of type
'System.Web.Mvc.HtmlHelper' could be found
(are you missing a using directive or an assembly reference?)


@Html.DisplayFor(m => m.Name)
works fine, but I just cant see why

@Html.DisplayNameFor(m => m.Name)
does not.

DisplayFor
displays the value for the model item and
DisplayNameFor
simply displays the name of the property?

Answer

Almost there. :)

The DisplayNameFor shows the name of the property or the string defined in the display attribute for the property.

public class Item
{
    public int ItemId { get; set; }

    [Display(Name = "Current name")]
    [Required(ErrorMessage = "Name is required")]
    [StringLength(160)]
    public string Name { get; set; }

    [Required(ErrorMessage = "Price is required")]
    [Range(0.01, 100.00,
        ErrorMessage = "Price must be between 0.01 and 100.00")]
    public decimal Price { get; set; }

}

Then @Html.DisplayNameFor(m => m.Name) would show 'Current name'.

@Html.DisplayNameFor(m => m.Price) would just show Price.

Note that you can also localize the display attribute like this:

[Display(ResourceType = typeof(MyResources), Name = "Name")]
public string Name{ get; set; }

Which in turn will look in the MyResources resc file. (If setup is done correctly).

The Html.DisplayFor shows the value of the field.