2017-12-24 5 views
-1

PROPERTY VM이 있는데 List<FounderInvestmentViewModel>이 포함 된 VM입니다. FounderInvestmentViewModel의 부분보기를 주 생성 속성보기에 성공적으로 삽입했습니다.다른 부분보기 문제 내부에 부분보기 삽입

FounderInvestmentViewModel은 차례로 List<InstallmentDetailsViewModel>을 포함합니다. InstallmentDetailsViewModel에 대한 부분 뷰를 _InstallmentDetails.cshtml으로 만들고 필요한 모든 작업을 수행했습니다.

_InstallmentDetails.cshtml을 부분보기 (FounderInvestmentViewModel)에 삽입하고 메인보기에 삽입하고 싶습니다.

첫째는 우리가 지금까지 사용했던 코드를 살펴 보자 : -

팸플릿보기 모델 : -

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> 

이가 메인입니다 보기 만들기 : -

이것은 내 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"); 
     } 

편집 : - 이 예외를 던지고 무엇 죄송합니다 - >>Collection.cshtml PROCESS : - 메인 뷰에서 "설립자 투자자 버튼 추가" 클릭 이벤트는 부분보기 _FounderInvestmentDetails.cshtml을 성공적으로 추가합니다. 이제 "추가 정보 추가"버튼이 추가됩니다.이 "추가 정보 추가"버튼을 클릭하면 _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; } 
}