2016-07-08 2 views
0

아래 PaymentInformationModel 클래스가 있습니다. 어느 쪽이 복합 형 CreditCardDetailModel을 가지고 있습니다. 양식을 제출할 때 CreditCartDetail 속성이 비어있는 채로 남아 있으며 사용자가 입력 한 모든 세부 정보로 채워질 것으로 예상됩니다. 사용자 지정 바인딩을 수행해야합니까, 아니면 내가 빠뜨린 기본 바인딩 트릭이 있습니까?MVC에서 복잡한 유형을 바인딩 할 수 없습니다.

PaymentInformationModel

public class PaymentInformationModel 
{ 

    public string PaymentAmount { get; set; } 


    public string TransactionReference { get; set; } 

    public string Description { get; set; } 
    public CreditCardDetailModel CreditCardDetail{get;set;} 

} 

CreditCardDetailModel

public class CreditCardDetailModel 
    { 


     public string CardNumber { get; set; } 


     public string Name { get; set; } 


     public string ExpiryDate { get; set; } 



     public int CardSecurityCode { get; set; } 

     public CreditCardType CardType { get; set; } 


    } 

VIEW

@model PaymentInformationModel 

@using (Html.BeginForm("", "Payment", FormMethod.Post, new { Id = "Form1", @class = "form-horizontal" })) 
{ 
    <div class="container"> 
     <div class="panel panel-default"> 
      <div class="panel-heading">Payment Information</div> 
      <div class="panel-body"> 
       <div class="form-group"> 
        @Html.LabelFor(x => x.PaymentAmount, new { @class = "control-label col-sm-2" }) 
        <div class="input-group col-sm-3"> 
         <span class="input-group-addon">$</span> 
         @Html.TextBoxFor(m => m.PaymentAmount, new { @class = "form-control col-sm-10" }) 
        </div> 
        @Html.ValidationMessageFor(m => m.PaymentAmount, "", new { @class = "help-block" }) 
       </div> 
       <div class="form-group"> 
         @Html.LabelFor(m => m.TransactionReference, new { @class = "control-label col-sm-2" }) 
         @Html.TextBoxFor(t => t.TransactionReference, new { @class = "form-control col-sm-10" }) 
       </div> 
       <div class="form-group"> 
        @Html.LabelFor(l => l.Description, new { @class = "control-label col-sm-2" }) 
        @Html.TextAreaFor(t => t.Description, new { @class = "form-control col-sm-10" }) 
       </div> 

      </div> 
     </div> 
     @Html.Action("CreditCardDetail") 
     <p class="log"></p> 

    </div> 
    <button type="submit" name="btnSubmit" id="btnSubmit" class="btn btn-success">PAY</button> 
} 

컨트롤러

[HttpPost] 
     public ActionResult Index(PaymentInformationModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       return View(); 
      } 
      return View(); 
     } 



public PartialViewResult CreditCardDetail() 
     { 
      return PartialView("CreditCardDetail_Partial"); 
     } 
+0

'CreditCardDetail' 속성에는 getter 만 있습니다. DefaultModelBinder는 ** 설정할 수 없습니다 **. 속성을 'public CreditCardDetailModel CreditCardDetail {get; 세트; }' –

+0

당신의'CreditCardDetailModel'은 다른'CreditCardDetailModel'에 대한 속성을 가지고있는 이유는 무엇입니까? –

+0

코드를 업데이트했습니다. – maxspan

답변

1

이름 속성으로 입력을 생성 CreditCardDetailModel의 부분보기를 반환하는 컨트롤러 메소드를 호출 @Html.Action()의 사용 등

<input name="CardNumber" .... /> 
<input name="ExpiryDate" .... /> 

그러나 모델에 바인딩하기 위해 당신의를 사용하는 이유는, 그들은

<input name="CreditCardDetail.CardNumber" .... /> 
<input name="CreditCardDetail.ExpiryDate" .... /> 

그것 명확해야 0 논리를 포함하지 않는 서버 메서드를 호출 할 수 있습니다. 을 쉽게 사용할 수 있습니다.이 경우에도 동일한 잘못된 name 특성이 계속 발생합니다.

유형 CreditCardDetailModel의 경우 EditorTemplate을 사용해야합니다. CreditCardDetail_Partial.cshtml 파일을 /Views/Shared/EditorTemplates 폴더로 이동하고 CreditCardDetailModel.cshtml (즉, 클래스 이름과 일치하도록) 이름을 바꿉니다. 그런 다음보기에서, 모델에 바인딩에 대한 올바른 name 특성을 생성 할

@Html.EditorFor(m => m.CreditCardDetail) 

를 사용합니다.

+0

실제로 저는 CreditCardDetail 모델에 대한 ParitalView를 이미 만들었습니다. 그래서 저는 부모의 모델 인 CreditCardDetailModel 속성을 가진 PaymentInformationModel을 사용하여 팔로 잉 뷰를 바인딩했습니다. 이렇게 모든 컨트롤을 바인딩했습니다. @ Html.TextBoxFor (m => m.CreditCardDetail.CardNumber, 새로운 {@ class = "form-control", 자리 표시 자 = "카드 번호"}).또한 나는 사용자 정의 된 모양과 느낌을 원했기 때문에 EditorFor를 사용하지는 않았지만 확실히 좋은 옵션이었습니다. – maxspan

+0

'EditorFor()'를 사용하는 것은 _view에 대한 사용자 정의 된 모양 및 느낌과 아무런 관련이 없습니다. (원하는대로 스타일을 지정할 수 있습니다.) –

+0

그래서 EditorFor에서 Partialview를 사용할 수 있습니다. – maxspan

관련 문제