2016-02-13 243 views
6

我有一个类asp.net中displayfor和displayname的简单解释是什么?

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

在我控制我传递了这样的一个实例来查看

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

     return View("Index", model);    
    } 

然后在视图中我尝试使用

@model GenericShop.Models.Item 

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

显示的名字,并获得以下错误

编译器错误消息:CS1061: 'System.Web.Mvc.HtmlHelper'不包含 'DisplayNameFor'的定义并且没有扩展方法 'DisplayNameFor'接受类型为 的第一个参数'System.Web.Mvc.HtmlHelper “可以发现 (是否缺少using指令或程序集引用?)

@Html.DisplayFor(m => m.Name)工作正常,但我只是不能明白为什么

@Html.DisplayNameFor(m => m.Name)没有。

DisplayFor显示模型项目的值,DisplayNameFor只显示属性的名称?

回答

14

几乎在那里。 :)

DisplayNameFor显示属性的名称或属性的display属性中定义的字符串。

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

} 

然后@Html.DisplayNameFor(m => m.Name)会显示'当前名称'。

@Html.DisplayNameFor(m => m.Price)只会显示价格。

请注意,您还可以本地化显示属性是这样的:

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

这反过来将看在为MyResources RESC文件。 (如果设置正确)。

Html.DisplayFor显示该字段的值。

+0

在你的答案中,你的意思是,如果你愿意...你在这两种情况下使用DisplayNameFor,这是令人困惑的。 – Minsk

+0

我第一次使用@ Html.DisplayNameFor(m => m.Name)链接到代码示例中的第8行。如果你看第5行你会看到[display(name =“current name”)]这将导致html呈现“当前名称” 在@ Html.DisplayNameFor(m => m.Price)中,我链接到line public decimal Price {get;组; }这个属性在它上面没有[display ...],所以asp.net mvc只显示propery的名字(这是Price)这个更清楚了吗? – RoteS

+1

是的,是的。因此,'DisplayNameFor(model => model.Field1)'显示(名称=“abcd”)并打印abcd。如果没有显示名称,他将改为使用属性名称。 – Minsk