2016-07-08 31 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

您使用的@Html.Action()被調用返回的CreditCardDetailModel的局部視圖與名稱屬性,這將產生輸入的控制器的方法,例如

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

但爲了結合到模型,他們需要成爲

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

其不清楚爲什麼使用@Html.Action()來調用一個不包含邏輯的服務器方法,並且您可以輕鬆使用@Html.Partial("CreditCardDetail_Partial"),儘管這仍會導致相同的錯誤name屬性。

對於CreditCardDetailModel類型,您需要使用EditorTemplate。將CreditCardDetail_Partial.cshtml文件移動到/Views/Shared/EditorTemplates文件夾並將其重命名爲CreditCardDetailModel.cshtml(即匹配類的名稱)。然後在視圖中,使用

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

這將生成正確的name屬性以綁定到您的模型。

+0

其實我已經爲CreditCardDetail模型創建了一個ParitalView。因此,我將自己的部分觀點與它的父模型(即具有CreditCardDetailModel屬性的PaymentInformationModel)綁定在一起,並且我像這樣綁定了所有控件。 @ Html.TextBoxFor(m => m.CreditCardDetail.CardNumber,new {@ class =「form-control」,placeholder =「Card Number」})。此外,我想爲我的視圖定製外觀和感覺,所以我沒有使用EditorFor,但絕對是一個不錯的選擇。 – maxspan

+0

使用'EditorFor()'與_a自定義外觀沒有任何關係_(您可以根據自己的喜好設計樣式) –

+0

因此我可以在EditorFor中使用我的Partialview。 – maxspan