복잡한 유형이 관련 될 때 Ajax 및 모델 바인딩을 어떻게 다루는가?
-
16-09-2019 - |
문제
내 견해에서 Ajax 호출을 할 때 모델 바인딩을 유지하고 싶습니다. 사용 중입니다 jQuery ajax 전화를 걸기 위해, 예를 들어, 이것은 ajax에서 호출하고 싶은 컨트롤러 방법입니다.
public ActionResult Create(Person personToCreate) {
//Create person here
}
보시다시피,이 방법은 모델 바인딩. 그러나이 방법을 훨씬 더 깨끗하게 만듭니다. 그러나 AJAX가 호출 할 때 DB에서는 불가능한 모든 변수를 제공해야 함을 의미합니다.
따라서 테이블이있는 경우 Person
변수가 있습니다.
firstName varchar(25) not-null
lastName varchar(25) not-null
myPet int not-null <-- This is a foreign key
그런 다음 엔티티 프레임 워크 클래스, Person
, 생성 된 것은 다음과 유사합니다.
public class Person {
public string firstName { get; set; }
public string lastName { get; set; }
public Pet myPet { get; set; }
}
변수 중 어느 것도 DB에 지정된대로 널가 될 수 없기 때문에 Ajax 호출이 string firstName
, string lastName
, Pet myPet
. 그러나 JavaScript는 애완 동물을 공급할 수 없습니다 ...
그래서 나는 두 가지 옵션 만 있습니다 (내가 알고있는).
DB에서 MyPet이 Null을 허용하십시오
애완 동물 대상을 요구하지 않는 사람을 나타내는 "더 평평한"클래스를 만듭니다 ...
즉:
public class SimplePerson {
public string firstName { get; set; }
public string lastName { get; set; }
public string myPetName { get; set; }
}
첫 번째 옵션의 문제점은 DB를 수정 해야하는 것이 이상하게 보인다는 것입니다.
두 번째 옵션의 문제점은 수업이 많고이 수업을 피하기 위해 중복 수업을 작성하는 것이 광범위 해 보인다는 것입니다. 모델 바인딩을 허용하기 위해 작성하십시오.
누구든지 더 나은 옵션을 생각하거나 한 옵션이 다른 옵션보다 더 나은 이유에 대해 추론 할 수 있습니까?
해결책
여기서 진짜 요령은 뷰 모델 클래스를 실제 모델 클래스와 분리하는 것입니다. 보기 모델 클래스는 조금 더 간단한 경향이 있으며 실제 작업을 수행하기 전에 실제 모델 클래스에 다시 매핑해야합니다. automapperp와 같은 도구는 이것을 거의 스냅합니다.