2010-11-29 35 views
3

Pourquoi les DataAnnotations ne fonctionnent pas sur les champs publics? Exemple:DataAnnotations sur les champs publics vs les propriétés dans MVC

namespace Models 
{ 
    public class Product 
    { 
     [Display(Name = "Name")] 
     public string Title; // { get; set; } 
    } 
} 

public ActionResult Test() 
{ 
    return View(new Models.Product() { Title = "why no love?" }); 
} 

@Html.LabelFor(m => m.Title) // will return 'Title' if field, or 'Name' if property 
@Html.DisplayFor(m => m.Title) 

Si le titre est un champ, l'attribut d'affichage semble avoir aucun effet. Si le titre est changé en propriété, cela fonctionne comme prévu et affiche "Nom".

Il semblerait facile dans cet exemple de simplement passer à une propriété, mais j'essaie d'utiliser les types de F # où ils sont compilés dans une classe avec des champs et non des propriétés.

Cela a été testé dans ASP.NET MVC 4 et RC 3.

Répondre

2

La raison pour laquelle DataAnnotations ne fonctionnent pas avec des champs est parce que le mécanisme semblable à la réflexion qui est utilisé pour récupérer les attributs (TypeDescriptor) ne supporte que les propriétés .

Bien que cela ne soit pas facile, nous pourrions envisager de travailler avec les champs si la demande est suffisante.

+0

Le sérialiseur JSON dans MVC renvoie à la fois les champs et les propriétés, pas sûr pourquoi les champs sont traités différemment pour les annotations. – yanta

+0

C'est une discordance entre les parties du framework .NET. DataAnnotations est uniquement pris en charge sur les propriétés par défaut (bien que vous puissiez écrire un MetadataProvider qui pourrait également inspecter les champs). D'autre part, la sérialisation JavaScript prend en charge les champs et les propriétés. C'est juste comme ça en ce moment. – marcind