2017-12-24 14 views
-1

PROPERTY私はList<FounderInvestmentViewModel>を含むVMを作成しました。FounderInvestmentViewModelの部分図をMain Create Propertyビューに挿入しました。部分ビューを別の部分ビューに挿入する問題(Collection.cshtml問題)

FounderInvestmentViewModelは、List<InstallmentDetailsViewModel>を含む。 InstallmentDetailsViewModelのパーシャルビューを_InstallmentDetails.cshtmlとして作成し、必要なすべての操作を行いました。

_InstallmentDetails.cshtmlFounderInvestmentViewModelの部分図に挿入して、メインビューに挿入したいとします。

まず私たちは、私がこれまで使用してきたコードを見てみましょう: -

プロパティビューモデル: -

public class PropertyViewModel 
    { 

     public int? Id { get; set; } 
     public string PropertyTitle { get; set; } 
     ....other attributes.... 
     public List<FounderInvestmentViewModel> FounderInvestments { get; set; } = new List<FounderInvestmentViewModel>(); 
    } 

FounderInvestmentViewModel: -

public class FounderInvestmentViewModel 
    { 
     public int? Id { get; set; }   
     public int InvestorId { get; set; } 
     public double Investment { get; set; } 
     public int InstallmentPeriod { get; set; } 
     public IEnumerable<SelectListItem> FounderInvestorList { get; set; } 
     public List<InstallmentDetailsViewModel> InstallmentDetails { get; set; } = new List<InstallmentDetailsViewModel>(); 

    } 

InstallmentDetailsViewModel: -

public class InstallmentDetailsViewModel 
    { 
     public int? Id { get; set; } 

     [Display(Name = "Pay Date")] 
     public List<DateTime> PayDates { get; set; } 
     [Required] 
     public List<double> InstallmentAmounts { get; set; } 
    } 
InstallmentDetailsため

PartialView(_InstallmentDetails.cshtml): -

@model propertyMgmt.ViewModel.InstallmentDetailsViewModel 

<div class="installmentDetails"> 
    @using (Html.BeginCollectionItem("InstallmentDetails")) 
    { 
     @Html.HiddenFor(m => m.Id, new { @class = "id" }) 

     <div class="form-group"> 
      @Html.LabelFor(m => m.InstallmentAmounts, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(m => m.InstallmentAmounts, new { htmlAttributes = new { @class = "form-control", @type = "number" } }) 
       @Html.ValidationMessageFor(m => m.InstallmentAmounts, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(m => m.PayDates, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(m => m.PayDates, new { htmlAttributes = new { @class = "form-control", @placeholder = "01/02/2017" } }) 
       @Html.ValidationMessageFor(m => m.PayDates, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
    } 
</div> 

この_InstallmentDetails.cshtmlはFounderInvestmentDetailsビューモデルのPartialViewあるこの_FounderInvestmentDetails.cshtmlに挿入されている: -

@model propertyMgmt.ViewModel.FounderInvestmentViewModel 

<div class="founderInvestmentDetails"> 
    @using (Html.BeginCollectionItem("FounderInvestments")) 
    {  
      @Html.HiddenFor(m => m.Id, new { @class = "id" }) 

      <div class="form-group"> 
       @Html.LabelFor(m => m.InvestorId, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.DropDownListFor(m => m.InvestorId, Model.FounderInvestorList, "Select Investor", htmlAttributes: new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.InvestorId, "", new { @class = "text-danger" })      
       </div> 
      </div> 

      <div class="form-group"> 
       @Html.LabelFor(m => m.Investment, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(m => m.Investment, new { htmlAttributes = new { @class = "form-control", @type = "number" } }) 
        @Html.ValidationMessageFor(m => m.Investment, "", new { @class = "text-danger" }) 

       </div> 
      </div> 
      <div class="form-group"> 
       @Html.LabelFor(m => m.InstallmentPeriod, htmlAttributes: new { @class = "control-label col-md-2", @type = "number" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(m => m.InstallmentPeriod, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(m => m.InstallmentPeriod, "", new { @class = "text-danger" }) 

       </div> 
      </div> 
      <div class="form-group" id="installmentDetailsDiv"> 
       @foreach (var InstallmentDetails in Model.InstallmentDetails) 
       { 
        @Html.Partial("_InstallmentDetails", InstallmentDetails) 
       } 
      </div> 

      <div class="form-group col-md-10"> 
       <input type="button" class="btn btn-info btn-xs" value="Add Installment Details" onclick="addInstallmentDetails()" /> 
      </div>  
    } 
</div> 

これはMAINでありますCREATE VIEW: -

これは、メインビューのMy JSコードです。 -

function addFounderInvestors() { 
     var url = '@Url.Action("FounderInvestmentDetails")'; 
     var form = $('form'); 
     var founders = $('#founderInvestmentDetails'); 
     $.get(url, function (response) { 
      founders.append(response); 
      // Reparse the validator for client side validation 
      form.data('validator', null); 
      $.validator.unobtrusive.parse(form); 
     }); 
    }; 

    function addInstallmentDetails() { 
     var url = '@Url.Action("InstallmentDetails")'; 
     var form = $('form'); 
     var installments = $('#installmentDetailsDiv'); 
     $.get(url, function (response) { 
      installments.append(response); 
      // Reparse the validator for client side validation 
      form.data('validator', null); 
      $.validator.unobtrusive.parse(form); 
     }); 
    }; 

コントローラコード: -

public PartialViewResult FounderInvestmentDetails() 
     { 
      var model = new FounderInvestmentViewModel { 
       FounderInvestorList = _investorQueryProcessor.GetInvestorByType(1).Select(x => new SelectListItem 
       { 
        Value = x.Id.ToString(), 
        Text = x.InvestorName 
       }) 

     }; 
      //return PartialView(model); 
      return PartialView("_FounderInvestmentDetails", model); 
     } 

     public PartialViewResult InstallmentDetails() 
     { 
      return PartialView("_InstallmentDetails",new InstallmentDetailsViewModel()); 
     } 
public ActionResult Create() 
     { 
      if (Session["AdminName"] != null) 
      { 
       //ViewBag.Investors = SelectListItems; 
       List<FounderInvestmentViewModel> model = new List<FounderInvestmentViewModel>(); 
       List<InstallmentDetailsViewModel> model2 = new List<InstallmentDetailsViewModel>(); 
       return View(new PropertyViewModel()); 

      } 
      else return Redirect("/Account/Login"); 
     } 

EDIT: - これは例外を投げているものです申し訳ありません - >>Collection.cshtml プロセス: - メインビューで、 "創設者の投資家のボタンを追加"ボタンをクリックすると、部分ビュー_FounderInvestmentDetails.cshtmlが正常に追加されます。「Add Installment Details」ボタンが追加されました。この「Add Installment Details」ボタン_InstallmentDetails.cshtml部分ビューを追加する必要がありますが、この部分は機能しません。私は、このボタンをクリックすると、私は次のコードでエラー"Object reference not set to an instance of an object"を得る: -

@using HtmlHelpers.BeginCollectionItem 

<ul>         
    @foreach (object item in Model)-->>ERROR CODE 
    { 
     <li> 
      @using (Html.BeginCollectionItem(Html.ViewData.TemplateInfo.HtmlFieldPrefix)) 
      { 
       @Html.EditorFor(_ => item, null, "") 
      } 
     </li> 
    } 
</ul> 
+3

[とNullReferenceExceptionは何ですか、と私はそれを修正しますか?](の可能性のある重複https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do- i-fix-it) –

+0

モデル 'propertyMgmt.ViewModel.FounderInvestmentViewModel'はNULLです。そういうわけで、あなたはNREを手に入れます。 –

+0

@CamiloTerevintoそのビューモデルがnullの場合、最初の部分ビューはなぜメインビューに追加されますか? – SudeepS

答えて

1

それはすでにPartialViewであり、複数回追加することができますようPaydatesや分割払いは<List>である必要はありません。

public class InstallmentDetailsViewModel { 
    public int? Id { get; set; }  
    [Display(Name = "Pay Date")] 
    public List<DateTime> PayDates { get; set; } 
    [Required] 
    public List<double> InstallmentAmounts { get; set; } 
} 
関連する問題