Установка атрибутов свойства в частичных классах
У меня есть класс сотрудника, созданный 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?
}
Ответы
Ответ 1
Фактически это возможно только через класс друзей, но это не рекомендуется. Вы должны сохранять свою валидацию в пользовательской модели представления, потому что часто вам нужны разные проверки для разных представлений, но ваша сущность может хранить только один набор атрибутов проверки.
Пример класса buddy:
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
}
}
Ответ 2
Вы не можете, насколько мне известно, это просто невозможно.
Вам следует посмотреть, есть ли MVC3 способ добавления атрибутов в другом месте (например, к типу), которые относятся к другому свойству.
В качестве альтернативы вы можете добавить свойство проксирования:
[ValidationAttributesHere]
public string ValidatedName
{
get { return Name; }
set { Name = value; }
}
Ответ 3
Другой способ сделать это:
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
class (см. ответ Ладислава Мрнки).