52 votes

En Utilisant Le Système.ComponentModel.DataAnnotations avec Entity Framework 4.0

Je travaille avec MVC3, et à l'aide de Entity Framework 4.0 Entités comme mon modèle. Jusqu'à présent, tout fonctionne très bien autant que de l'utiliser comme un modèle (toutes les opérations crud/page générations travailler hors de la boîte). Je me demandais, si, comment obtenez-vous le même robuste, les étiquettes et les informations de validation lorsque vous générez un modèle manuellement?

Voici un exemple de ce que je veux dire. C'est une classe générée par l'exemple de MVC3 projet:

public class LogOnModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Avec l'exemple ci-dessus, vous pouvez spécifier ce qui est rendu dans une étiquette pour le champ (Affichage), et le type de champ à utiliser (Mot de passe). Cependant, lorsque j'essaie d'utiliser le cadre de l'entité et de le pousser à la vue ci-dessous, je vois les étiquettes générées automatiquement sont juste les noms de champ et pas ce que je veux à l'utilisateur de voir/lire:

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Person</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.FirstName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.FirstName)
            @Html.ValidationMessageFor(model => model.FirstName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.MiddleName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.MiddleName)
            @Html.ValidationMessageFor(model => model.MiddleName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.LastName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LastName)
            @Html.ValidationMessageFor(model => model.LastName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Birthdate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Birthdate)
            @Html.ValidationMessageFor(model => model.Birthdate)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>}

enter image description here

Ma question est: Comment puis-je ajouter ces décorations pour les entités qui sont générées à l'aide de EF4? Est-il quelque chose en dehors du Système.ComponentModel.DataAnnotations que je devrais utiliser? Je sais entités obtenir régénéré et ce n'est probablement pas une bonne idée de l'ajouter à des entités du code directement, mais pour une raison que je ne peux pas penser à une meilleure approche que les entrer manuellement le texte de l'étiquette dans la vue (boiteux, il n'y a aucune raison d'avoir à le faire, c'est MVC!). Je veux faire en sorte que la demande est suffisamment dynamique pour être en mesure de d'avoir le bon affichage des informations pour mon modèle de traverser et de garder une approche MVC. Comment dois-je faire?

83voto

Austin Lamb Points 2382

Je n'ai pas fait cela pour ASP.NET MVC (uniquement pour Silverlight), mais je crois que les mêmes principes s'appliquent. Vous pouvez créer un "métadonnées copain de classe" comme ci-dessous, parce que les types générés par l'EF doit être partiel, ainsi vous pouvez ajouter un peu plus (comme le MetadataTypeAttribute) et ensuite vous créer ce frère classe qui contient les métadonnées.

C'est un peu moche, mais devrait fonctionner. Il va quelque chose comme ceci (en supposant que l'EF entité est nommée "Personne"):

[MetadataType(typeof(PersonMetadata))]
public partial class Person { 
  // Note this class has nothing in it.  It's just here to add the class-level attribute.
}

public class PersonMetadata {
  // Name the field the same as EF named the property - "FirstName" for example.
  // Also, the type needs to match.  Basically just redeclare it.
  // Note that this is a field.  I think it can be a property too, but fields definitely should work.

   [Required]
   [Display(Name = "First Name")]
  public string FirstName;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X