2016-07-25 1 views
-1

J'ai un modèle (voir ci-dessous) et l'utilisateur devrait être capable de regarder un seul détail des dépenses (qui fonctionne déjà avec ajax et qui est piloté par une liste déroulante). Une fois que les détails des dépenses sont chargés, ils devraient être en mesure de saisir soit un montant total pour ces détails, soit de les ventiler par catégorie (provenant d'un modèle différent (SpendCategories) qui est pré-rempli). Je commence par parcourir les catégories pour les récupérer et pour chaque ligne, je mets SpendCategoryName en SpendCategory dans SpendBreakdown.cs. J'essaye d'itérer et de générer la zone de texte par nom SpendCategory, puis renvoyer le modèle entier (budgets).Comment renvoyer la liste des éléments en tant que modèle de la vue au contrôleur?

Problème

Quand je lance cela, il me donne un argument hors de portée exeception sur la ligne de HiddenFor dans la boucle. J'ai juste besoin d'un moyen de sauvegarder les montants et les catégories à poster. Malheureusement, je suis nouveau sur MVC et je ne peux pas changer la façon dont le modèle est configuré. Tout fonctionne sauf pour cette pièce.

J'ai eu à frotter une partie de cette baisse à des fins de confidentialité, mais s'il vous plaît laissez-moi savoir si vous avez besoin d'éclaircissements

Modèle

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 données renseignées)

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

de Vue partielle sur la page principale qui appelle ceci est partiel a le formulaire de soumission

<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 (appelé à alimenter le modèle sur le changement dropdownlist

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

La méthode d'action de votre contrôleur reçoit-elle le modèle? Ou quoi? –

+0

@devlincarnate actuellement non, je reçois un argument hors de l'exception de gamme sur le premier de la première ligne sous la boucle FOR. quand j'ai essayé cela plus tôt avec 1 catégorie avant la liste publique SpendingBreakdown était une liste, il récupérait tout bien. Mais maintenant que SpendingBreakdown est une liste que j'ai des problèmes – cxwilson

Répondre

0

Vous utilisez le Count de SpendCategories pour l'indice:

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

mais vous indexez réellement SpendBReakdown:

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

Ces deux éléments ne sont pas le même nombre d'éléments, donc va au-delà de l'indice à la fin de SpendBreakdown. Assurez-vous que ceux-ci sont correctement remplis s'ils sont censés être corrélés.Sinon, utilisez simplement un foreach sur SpendBreakdowns.

+0

comment puis-je obtenir ces 2 à corréler? J'ai besoin des textareas pour chacune des SpendCategories (il y en a 10) Maintenant, SpendBreakdowns n'a rien encore – cxwilson

+0

Lorsque vous remplissez votre Modèle, vous devez vous assurer que les données correctes sont chargées dans 'SpendBreakdown'. Je devrais voir le code qui fait cela pour voir ce qui ne va pas. –

+0

mis à jour avec le contrôleur qui remplit le modèle – cxwilson