Использование System.ComponentModel.DataAnnotations с Entity Framework 4.0 - PullRequest
50 голосов
/ 06 февраля 2011

Я работаю с MVC3 и использую Entity Framework 4.0 Entities в качестве моей модели.До сих пор все прекрасно работает, если использовать его в качестве модели (все операции / генерации страниц страниц работают из коробки).Мне интересно, однако, как вы получаете те же надежные метки и проверочную информацию, что и при создании модели вручную?

Вот пример того, что я имею в виду.Это класс, сгенерированный примером проекта MVC3:

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

В приведенном выше примере вы можете указать, что будет отображаться в метке для поля (Display) и какой тип поля использовать (Password).).Однако, когда я пытаюсь использовать платформу сущностей и выдвигаю ее в представлении ниже, я вижу, что автоматически сгенерированные метки - это просто имена полей, а не то, что я хочу, чтобы пользователь видел / должен прочитать:

@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

Мой вопрос: Как добавить эти дополнительные украшения к сущностям, которые генерируются с помощью EF4?Есть ли что-то кроме System.ComponentModel.DataAnnotations, что я должен использовать?Я знаю, что сущности восстанавливаются, и, вероятно, не стоит добавлять это непосредственно в код сущностей, но по какой-то причине я не могу придумать лучшего подхода, чем ввод текста метки вручную в представлении (хромой, нет причиндолжен сделать это, это MVC!).Я хочу сохранить его так, чтобы приложение было достаточно динамичным, чтобы иметь возможность отображать правильную отображаемую информацию для моей модели и придерживаться подхода MVC.Как мне это сделать?

Ответы [ 3 ]

79 голосов
/ 07 февраля 2011

Я не сделал этого для ASP.NET MVC (только для Silverlight), но я верю, что применимы те же принципы. Вы можете создать «класс друзей метаданных», как показано ниже, потому что типы, сгенерированные EF, должны быть частичными, поэтому вы можете добавить к ним немного больше (например, MetadataTypeAttribute), а затем вы создадите этот класс-брат, который содержит метаданные. *

Это некрасиво, но должно сработать. Это выглядит примерно так (при условии, что сущность EF называется «Person»):

[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;
}
1 голос
/ 21 ноября 2016

Как и ответ Остина Лэмба , но вместо этого, вложив класс MetaData в класс сущности, тем самым уменьшая количество классов в вашем общедоступном списке пространств имен и устраняя необходимость иметь уникальный имя для каждого класса метаданных.

using System.ComponentModel.DataAnnotations;

namespace Validate.Models
{
    [MetadataType(typeof(MetaData))]
    public partial class Person
    {
        public class MetaData
        {
            [Required]
            [Display(Name = "Enter Your Name")]
            public string FirstName;

            //...
        }
    }
}
1 голос
/ 16 апреля 2016

То же, что и выше, но со всеми деталями, и это работает

enter image description here

enter image description here

enter image description here

enter image description here

А вот и код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace Validate.Models
{
    [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 = "Enter Your Name")]
        public string FirstName;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...