2016-07-25 11 views
-1

Ich habe ein Modell (siehe unten) und der Benutzer sollte in der Lage sein, einen einzigen Ausgaben Details (bereits mit AJAX arbeiten und ist Dropdown-gesteuert) zu sehen. Sobald die Ausgabendetails geladen sind, sollten sie in der Lage sein, entweder einen Gesamtbetrag für diese Details einzugeben oder sie nach Kategorie aufzuteilen (die von einem anderen Modell (SpendCategories) stammt, das vorher ausgefüllt wurde). Ich durchforste zuerst die Kategorien, um sie zurückzuziehen, und für jede Zeile mappe ich den SpendCategoryName auf die SpendCategory in SpendBreakdown.cs. Ich versuche, pro SpendCategory-Name ein Textfeld zu generieren und anschließend das gesamte Modell (Budgets) zurückzusenden.Wie wird die Liste der Artikel als Modell von der Ansicht an den Controller zurückgegeben?

Problem

Als ich dies führen Sie es mich ein Argument außerhalb des zulässigen Bereichs exeception auf der HiddenFor Linie in der for-Schleife gibt. Ich brauche nur einen Weg, die Beträge und Kategorien auf dem Post zurück zu speichern. Leider bin ich neu in MVC und kann die Art, wie das Modell eingerichtet wird, nicht ändern. Bis auf dieses Stück funktioniert alles.

Ich hatte etwas von diesem nach unten für die Privatsphäre Zwecke schrubben, aber lassen Sie es mich wissen, wenn Sie Klärung bedürfen

Modell

public class Budgets : Financials 
{ 
    public Spend Spending { get; set; } 
    public SpendDetails SpendingDetails { get; set; } 
    public List<SpendBreakdown> SpendingBreakdown{ get; set; } 
} 

Spend.cs

public int SpendId {get; set;} 
public List<SpendCategories> SpendCategories {get; set;} 

SpendCategories.cs (PRE bevölkert DATA)

public int SpendCategoryId {get; set;} 
public string SpendCategoryName {get; set;} 
public string SpendCategoryDescription {get; set;} 

SpendDetails.cs

public int SpendDetailsId {get; set;} 
public int SpendId {get; set;} 
public string SpendDetailName {get; set;} 
public int SpendBreakdownId {get; set;} 
public decimal TotalSpendAmount {get; set;} 

SpendBreakdown.cs

public int SpendBreakdownId {get; set;} 
public int SpendDetailsId {get; set;} 
public decimal SpendBreakdownAmount {get; set;} 
public string SpendCategory {get; set;} 

Teilansicht auf der Hauptseite, die dieser Teil ruft ist, hat das Formular

<div class="row col-md-5"> 
    <div class="table-responsive"> 
     <table class="table-bordered"> 
      <thead> 
       <tr> 
        <th class="dt-head-center">Category:</th> 
        <th>Total Amount: </th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr> 
        <td>@Html.DisplayFor(model => model.SpendDetails.SpendCategories)</td> 
        <td>@Html.TextAreaFor(model => model.SpendDetails.TotalSpendAmount)</td> 
       </tr> 
      </tbody> 
     </table> 
    </div> 
</div> 
<div class="row totals"> 
    <div class="table-responsive col-md-6"> 
     <table class="table table-bordered table-condensed table-responsive" id="tblSpendSummary" summary="Spend Summary" style="padding-left: 10px;"> 
      <thead> 
       <tr class="summary-header"> 
        <th class="dt-head-center">Spend Category Name</th> 
        <th class="dt-head-center">Spend Breakdown Amount</th> 
       </tr> 
      </thead> 
      <tbody> 

       @foreach (var cat in Model.Spend.SpendCategories) 
       { 
        <tr> 
         <td>@cat.SpendCategoryName- @cat.SpendCategoryDescription</td> 

         @for (int i = 0; i < Model.Spend.SpendCategories.Count(); i++) 
         { 
          @Html.HiddenFor(model => model.SpendBreakdown[i].SpendCategory, new { @Value = @cat.SpendCategoryDescription }) 
          @*@Html.HiddenFor(model => model.SpendBreakdown[i].SpendBreakdownId)*@ 
          <td>@Html.TextAreaFor(model => model.SpendBreakdown[i].SpendBreakdownAmount)</td> 
         } 
        </tr> 
       } 
      </tbody> 
     </table> 
    </div> 
</div> 

UI enter image description here

-Controller (Called das Modell auf Dropdownlist-Änderung zu füllen

public ActionResult BudgetTotalAmount(int spendDetailsId) 
    { 
     var SpendId = _executionRepository.RetrieveSpendIdBySpendDetailsId (spendDetailsId).SpendId; 

     var model = new Budgets 
     { 
      Spending = _executionRepository.RetrieveSpendIdBySpendDetailsId(spendDetailsId), 
      SpendingDetails = _executionRepository.RetrieveSpendSpendDetailsBySpendDetailsId(spendDetailsId), 
      SpendingBreakdown = _executionRepository.RetrieveSpendBreakdown(spendId, spendDetailsId) 
     }; 

     return PartialView("Budgets/_SpendBudgetsTotalAmounts", model); 
    } 
+0

Empfängt die Controller-Aktion das Modell? Oder was? –

+0

@devlincarnate zur Zeit keine, ich bekomme eine Argument außerhalb des Bereichs Ausnahme auf der ersten in der ersten Zeile unter der FOR-Schleife. Als ich dies früher mit 1 Kategorie vor der öffentlichen Liste versuchte, war SpendingBreakdown eine Liste, die alles wieder gut bekam. Aber jetzt, dass SpendingBreakdown ist eine Liste Ich habe Probleme – cxwilson

Antwort

0

Sie sind die Count von SpendCategories für den Index verwendet:

@for (int i = 0; i < Model.Spend.SpendCategories.Count(); i++) 

aber Sie indizieren tatsächlich SpendBReakdown:

@Html.HiddenFor(model => model.SpendBreakdown[i].SpendCategory, new { @Value = @cat.SpendCategoryDescription }) 

Diese beiden Elemente nicht die gleiche Anzahl von Elementen haben, so dass der Index über das Ende des SpendBreakdown wird. Stellen Sie sicher, dass diese korrekt ausgefüllt sind, wenn sie korrelieren sollen.Ansonsten verwenden Sie einfach foreach unter SpendBreakdowns.

+0

Wie kann ich diese 2 korrelieren? Ich brauche die Textareas für jede der SpendCategories (es gibt 10) Im Moment hat SpendBreakdowns noch nichts drin – cxwilson

+0

Wenn Sie Ihr Modell bevölkern, müssen Sie sicherstellen, dass die richtigen Daten in 'SpendBreakdown' geladen sind. Ich müsste den Code sehen, der das macht, um zu sehen, was dort falsch ist. –

+0

aktualisiert mit Controller, der das Modell bevölkert – cxwilson

Verwandte Themen