Minsk
Minsk

Reputation: 315

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?

Upvotes: 26

Views: 50125

Answers (1)

RoteS
RoteS

Reputation: 1455

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.

Upvotes: 41

Related Questions