Validar tipos complexos com DataAnnotations
-
21-08-2019 - |
Pergunta
Eu decidi usar o Entity Framework para O / R Mapping, e DataAnnotations para validação no meu projeto, e eu já encontrou um problema estranho ao tentar implementar isso.
Este é o que eu fiz:
Eu tenho o seguinte tipo de entidade
Contact
*******
Int32 Id (not null, Entity Key)
Name Name (not null)
Address Address (not null)
String Phone
String Email
onde Name
e Address
são tipos complexos definidos da seguinte forma:
Name Address
**** *******
String First (not null) String Street (not null)
String Last (not null) String ZipCode (not null)
String City (not null)
E as seguintes classes residir no mesmo espaço de nomes como os meus entidades:
public class ContactMetadata
{
[Required]
public Name Name { get; set; }
}
[MetadataType(typeof(ContactMetadata))]
partial class Contact { }
No entanto, quando eu criar um novo item Contact
, os tipos Name
e Address
estão cheios de casos de Name
e Address
onde todos os valores são null
, em vez de Name
e Address
ter próprios valores null
. Assim, o atributo Required
não lançar quaisquer erros, apesar de todos os valores são null
. Como posso resolver isso?
Solução
Assim, ele cria instâncias do nome e endereço objetos que suas propriedades são nulos? Interessante.
Você pode simplesmente colocar o atributo [Obrigatório] sobre as crianças?
EDIT: Eu sei que isso pode ser considerado uma forma fedorento de fazer isso, mas para maior clareza eu editar a sua resposta para o post, para que ele possa mais fácil ser encontrado pela próxima pessoa a ter problemas com isso ...
Sugestão (e aceito, mas ainda não testado) Solução:
Escrever um atributo de validação personalizada que valida contra os valores null
.
Outras dicas
Certifique-se os nomes que acabam em campos HTML alinhar com os nomes das propriedades da classe.
Por exemplo, se você tem o seguinte:
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; }
[...]
}
As suas chamadas para os ajudantes HTML deve olhar como este:
<%= Html.TextBox("FirstName") %>
<%= Html.TextBox("LastName") %>
<%= Html.TextBox("Address.Street") %>
<%= Html.TextBox("Address.City") %>
[...]
Confira este post complexo DataAnnotations-validação . Eu acho que o atributo RequiredAssociation é o que você precisa. Você pode ter que ajustá-lo um pouco para Entity Framework em vez de LINQ to SQL.
Eu estou lutando com o mesmo problema agora. Eu acho que uma forma semi-graciosa de fazer isso é para fazer referência ao tipo primitivo chave como uma propriedade, e colocar o DataAnnotation sobre isso. Aqui está um exemplo com AddressID sendo o campo de chave.
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;}
}