2017-12-24 5 views
-1

Ich habe PROPERTY VM, die List<FounderInvestmentViewModel> enthält. Ich habe erfolgreich die Teilansicht von FounderInvestmentViewModel in die Ansicht Haupteigenschaften erstellen eingefügt.Einfügen Teilansicht innerhalb einer anderen Teilansicht Probleme (Collection.cshtml PROBLEM)

FounderInvestmentViewModel wiederum enthält List<InstallmentDetailsViewModel>. Ich habe die Teilansicht für InstallmentDetailsViewModel als und alle notwendigen Aktionen erstellt.

Ich möchte die _InstallmentDetails.cshtml in die Teilansicht FounderInvestmentViewModel einfügen, die wiederum in die Hauptansicht eingefügt wird.

Zuerst schauen wir uns die Codes einen Blick darauf werfen, die ich verwendet habe, so weit: -

Property View Modell: -

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; } 
    } 

PartialView für InstallmentDetails (_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> 

Diese _InstallmentDetails.cshtml in diese eingeführt ist, die _FounderInvestmentDetails.cshtml PartialView für FounderInvestmentDetails Ansicht Modell ist: -

@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> 

Dies ist der Haupt CREATE VIEW: -

@model propertyMgmt.ViewModel.PropertyViewModel.PropertyViewModel 
@{ 
    ViewBag.Title = "Create";  
} 
<script src="~/Areas/Admin/themes/jquery/jquery.min.js"></script>   
<h2>Property</h2>  
@using (Html.BeginForm("Create", "Property", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Add Property</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.PropertyTitle, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.PropertyTitle, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.PropertyTitle, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     .....Other form Groups..... 
     <div id="founderInvestmentDetails">   
      @foreach(var FounderInvestments in Model.FounderInvestments) 
      { 
      @Html.Partial("_FounderInvestmentDetails", FounderInvestments) 
      } 
     </div> 

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

das ist mein JS-Code in der Hauptansicht ist: -

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); 
     }); 
    }; 

Controller-Code: -

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: - leider das ist, was die Ausnahme wirft - >>Collection.cshtml PROZESS: - in der Hauptansicht "Gründer Investor Buttons hinzufügen" on click event fügt die Teilansicht _FounderInvestmentDetails.cshtml erfolgreich hinzu. Nun wird die Schaltfläche "Add Rate Details" angehängt. Nach Klicken auf diese Schaltfläche "Add Rate Details" _InstallmentDetails.cshtml sollte eine Teilansicht angehängt werden, ABER dieser Teil funktioniert nicht. Wenn ich auf diese Schaltfläche klicken, erhalte ich die Fehler "Object reference not set to an instance of an object" in dem folgenden Code: -

@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

Mögliche Duplikat [Was für eine Nullreferenceexception ist, und wie kann ich es beheben?] (Https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do- i-fix-it) –

+0

Das Modell 'propertyMgmt.ViewModel.FounderInvestmentViewModel' ist NULL. Deshalb bekommst du eine NRE. –

+0

@CamiloTerevinto Wenn dieses Ansichtsmodell null war, warum sollte die erste Teilansicht an die Hauptansicht angehängt werden? – SudeepS

Antwort

1

Die Paydates und Fortsetzungs muss nicht <List> sein, wie es bereits ein PartialView und kann mehrfach hinzugefügt werden.

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; } 
} 
Verwandte Themen