Установка атрибутов свойства в частичных классах - PullRequest
23 голосов
/ 25 июля 2011

У меня есть класс сотрудника, сгенерированный Entity Framework (EF).

public partial class employee
{
    private string name;
    public string Name
    {
        get{return name;}
        set{ name = value;}
    }
}

Теперь я хочу поместить обязательный атрибут в свойство name, чтобы использовать его для проверки MVC3 вдругой частичный класс сотрудника, который я написал для того, чтобы расширить класс, сгенерированный EF, чтобы мне не пришлось переписывать свой код, если я обновляю модель, сгенерированную EF.

Мой написанный частичный класснаходится в той же сборке и пространстве имен.

public partial class employee
{
    // What should I write here to add required attribute in the Name property?
}

Ответы [ 3 ]

27 голосов
/ 25 июля 2011

На самом деле это возможно только через класс друзей, но это не рекомендуется.Вы должны сохранить свою проверку в пользовательской модели представления, потому что часто вам нужны разные проверки для разных представлений, но ваша сущность может хранить только один набор атрибутов проверки.

Пример класса партнера:

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(EmployeeMetadata))]
public partial class Employee
{
  private class EmployeeMetadata
  {
     [Required]
     public object Name; // Type doesn't matter, it is just a marker
  }
}
9 голосов
/ 25 июля 2011

Насколько я знаю, вы не можете - это просто невозможно.

Возможно, вам следует посмотреть, есть ли у MVC3 какой-либо способ добавления атрибутов в другом месте (например, к типу), которые относятся к другому свойству.

Кроме того, вы можете добавить свойство прокси:

[ValidationAttributesHere]
public string ValidatedName
{
    get { return Name; }
    set { Name = value; }
}
0 голосов
/ 26 сентября 2014

Еще один способ сделать это:

private class EmployeeMetadata
{
    //the type HAS to match what your have in your Employee class
    [Required]
    public string Name { get; set; }
}

public partial class Employee : EmployeeMetadata
{
}

По крайней мере, это работало с Linq to SQL. Однако у меня были проблемы с доступом к атрибутам через GetCustomAttributes (даже использование System.Attribute.GetCustomAttributes, похоже, не помогло). Тем не менее, MVC действительно уважал эти атрибуты. Кроме того, это не будет работать с наследованием от интерфейсов. Передача атрибутов из интерфейса будет работать только с использованием MetadataType атрибута класса (см. ответ Ладислава Мрнки ).

...