como você ir sobre como lidar com ajax e Model Binding quando tipos complexos estão envolvidos?
-
16-09-2019 - |
Pergunta
Eu gostaria de manter modelo de ligação ao fazer chamadas Ajax da minha vista. Estou usando jquery ajax para fazer as chamadas, e apenas como um exemplo- este é o meu método de controlador Eu quero chamar de ajax:
public ActionResult Create(Person personToCreate) {
//Create person here
}
Como você pode ver, este método está contando com Modelo Encadernação . Isso faz com que o método muito mais limpo ... no entanto, isto significa que, quando o Ajax faz uma chamada, ele deve fornecer todas as variáveis ??que são não-nulo no DB.
Então, se eu tiver uma tabela chamada Person
que tem variáveis:
firstName varchar(25) not-null
lastName varchar(25) not-null
myPet int not-null <-- This is a foreign key
Então, o Entity Framework classe, Person
, criada seria semelhante a:
public class Person {
public string firstName { get; set; }
public string lastName { get; set; }
public Pet myPet { get; set; }
}
Uma vez que nenhuma das variáveis ??pode ser nulo (conforme especificado no DB) Isto significa que a chamada ajax deve fornecer um string firstName
, string lastName
, Pet myPet
. Mas javascript não pode fornecer o Pet ...
Então, eu só tenho duas opções (que eu saiba):
-
Permitir mypet ser nulo na DB
-
Crie uma classe "mais plana" que representa uma pessoa que não requer o objeto pet ...
ou seja:
public class SimplePerson {
public string firstName { get; set; }
public string lastName { get; set; }
public string myPetName { get; set; }
}
O problema com a primeira opção é que parece estranho ter que modificar o DB ... definitivamente algo errado sobre isso, porque ele está permitindo que as coisas que não deveriam estar ...
O problema com a segunda opção é que eu tenho um monte de aulas e parece extensa estar escrevendo aulas duplicados para cada um apenas para evitar isso ... Se eu tivesse 30 classes, que seriam 30 aulas duplicados que eu teria que criar, a fim de permitir a ligação modelo.
Alguém pode pensar em quaisquer opções melhores, ou dar raciocínio sobre por que uma opção seria melhor que o outro?
Solução
O verdadeiro truque aqui é separar suas aulas vista modelo das classes de modelo reais. As aulas vista modelo tendem a ser um pouco mais simples, e você precisa mapeá-los de volta para suas classes de modelo reais antes de fazer coisas reais com eles. Ferramentas como AutoMapper fazer esta praticamente uma pressão embora.