MVC에서 가장 큰 문제 중 하나는 복잡한 속성 (뷰 모델)을 모델에 연결하여 폼에 사용할 때입니다. 예를 들어 Customer.cs라는 모델이 있습니다. 이 고객은 언제든지 1 개의 주문을 받았습니다. 그래서 나는 그에게 Customer.Order의 속성을 부여합니다. 고객은 그를 고유 한 고객으로 정의하는 많은 다른 속성을 가지고 있습니다. Order 속성에는 고유 한 속성 집합이 있습니다. 그래서 저는 컨트롤러, 다른 모델 값을 만들고, 마지막으로 뷰 세부 정보 작업을 시작합니다.
Form 자체를 정의하는 것으로 시작합니다.
@using (Html.BeginForm("Customer", "Home", FormMethod.Post, new { @id = "customerForm" })
이 양식 선언은 기본적으로 사용자가 제출을 클릭하면이 양식 내의 모든 것이 직렬화되어 컨트롤러로 전송되어야한다고 View에 알려줍니다. 먼저 주 모델 인 Customer.cshtml에 대한보기를 만듭니다. Customer.cs 모델을 사용합니다.
저는 Order.cshtml이라는이 복잡한 개체에 대해 특별히보기를 만듭니다. 그것은 Order.cs 모델을받습니다 (그래서 저는 똑똑하고 앞서 생각하기 때문에 Invoice와 같은 다른 상위 모델에서 나중에 재사용 할 수 있습니다.) 그래서 저는이 모든 자바 스크립트와 뷰에 의존하는 뷰 로직을 작성했습니다. 독립적이고 다른 모델과 재사용 가능합니다. 선언에 대한 내 텍스트 상자는 다음과 같습니다.
@Html.TextBoxFor(m => m. OrderDate)
제출을 클릭 할 때 가장 먼저 발견 한 것은 Order 개체의 값이 다시 게시되지 않는다는 것입니다. 그래서 나는 거기 앉아서 디버그하고 시간이 걸리지 만 마침내 이것이 이런 식으로 작동하지 않을 것이라는 것을 알게되었습니다. 뷰 모델을 개별적으로 직렬화하는 방법이없는 한 상위 모델에 연결해도 기본 양식 제출 프로세스를 수동으로 재정의하기 위해 자바 스크립트를 작성해야하며 다른 모델 제출도 함께 작성해야합니다. 클라이언트 측 필드 유효성 검사를 위해.
이것을 처리하는 더 쉬운 방법이 있어야한다고 생각합니다. 이 문제에 대한 방법을 알고 있지만 예쁘지 않습니다. 대신 Customer.cs 모델을 가져 오도록 Order.cs에 대한보기를 만들 수 있습니다. 그런 다음 다음과 같은 선언에 텍스트 상자를 사용하십시오.
@Html.TextBoxFor(m => m.Order.OrderDate)
보기의 모든 속성을 정의합니다. 이것은 기본 바인딩에서 작동하며 모든 것이 잘됩니다. 단, 이미 JavaScript로 작성한 코드는 어떻습니까? 양식에 배치 된 ID에 대한 모든 참조에 "Order_"를 추가해야합니다. 또한 이것은 이제 모델간에 쉽게 이동하지 않습니다. 이제는 Customer.cs 모델을 사용하므로 Order 개체를 사용하는 새 모델을 만들 때마다이 뷰를 다시 만들어야합니다. 또한 자바 스크립트를 다시 작성하거나 접두사 (ViewData)를 전달하는 멋진 방법을 찾아야합니다. 이것은 정확하지 않은 것 같습니다. 내가 무엇을 잘못하고 있지?
Order를 사용하는 모든 뷰 모델에 대한 인터페이스를 만드는 경우 :
interface IWithOrder
{
Order Order { get; set; }
}
공통 주문보기에서이 인터페이스를 사용하십시오.
@model Project.ViewModels.IWithOrder
...
@Html.TextBoxFor(m => m.Order.OrderDate, new { Id = "OrderDate" })
고객의 경우 IWithOrder에서 파생 된 고객보기 모델을 만들 수 있습니다.
public class CustomerViewModel : IWithOrder
{
public Order Order { get; set; }
public Customer Customer { get; set; }
}
이제 Order
뷰 를 재사용 할 수 있지만 뷰 모델은 IWithOrder에서 파생되어야합니다.
js 참조 에 추가하지 않으려 htmlAttributes
는 TextBoxFor
경우 매개 변수 에서 html 요소의 ID를 설정할 수도 있습니다 Order_
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다