Проверка сложных типов с помощью DataAnnotations - PullRequest
2 голосов
/ 30 июня 2009

Я решил использовать Entity Framework для O / R Mapping и DataAnnotations для проверки в моем проекте, и теперь я столкнулся со странной проблемой при попытке реализовать это.

Вот что я сделал:

У меня есть следующий тип сущности

Contact
*******
Int32 Id (not null, Entity Key)
Name Name (not null) 
Address Address (not null)
String Phone
String Email

, где Name и Address - комплексные типы, определенные следующим образом:

Name                                  Address
****                                  *******
String First (not null)               String Street (not null)
String Last (not null)                String ZipCode (not null)
                                      String City (not null)

И следующие классы находятся в том же пространстве имен, что и мои сущности:

public class ContactMetadata
{
    [Required]
    public Name Name { get; set; }
}

[MetadataType(typeof(ContactMetadata))]
partial class Contact { }

Однако, когда я создаю новый элемент Contact, типы Name и Address заполняются экземплярами Name и Address, где все значения равны null вместо Name и Address имеющие null сами значения. Таким образом, атрибут Required не выдает никаких ошибок, хотя все значения null. Как мне обойти это?

Ответы [ 4 ]

1 голос
/ 30 июня 2009

Убедитесь, что имена, заканчивающиеся в полях HTML, совпадают с именами свойств класса.

Например, если у вас есть это:

public class Contact {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

public class Address {
    public string Street { get; set; }
    public string City { get; set; }
    [...]
}

Ваши обращения к помощникам HTML должны выглядеть следующим образом:

<%= Html.TextBox("FirstName") %>
<%= Html.TextBox("LastName") %>
<%= Html.TextBox("Address.Street") %>
<%= Html.TextBox("Address.City") %>
[...]
1 голос
/ 30 июня 2009

Итак, он создает экземпляры объектов Name и Address, чьи свойства имеют значение null? Интересно.

Можете ли вы просто поставить атрибут [Required] для дочерних элементов?

РЕДАКТИРОВАТЬ: Я знаю, что это может считаться вонючим способом сделать это, но для ясности я отредактировал ваш ответ в сообщении, чтобы его легче было найти следующему человеку, имеющему проблемы с этим ...

Предложено (и принято, но еще не проверено) Решение:

Напишите пользовательский атрибут проверки, который проверяет значения null.

0 голосов
/ 28 мая 2011

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

public class Contact{

[Required]
public int? AddressIDForValidation{
get{return this.Address.AdressID;}
}

public Address Address{get;set;}
}



public class Address{
public int? AddressID{get;set;}
public string Street{get;set;}
}
0 голосов
/ 30 июля 2009

Ознакомьтесь с этой записью в блоге complex-dataannotations-validation . Я думаю, что атрибут RequiredAssociation - это то, что вам нужно. Возможно, вам придется немного изменить его для Entity Framework вместо LINQ to SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...