2017-05-18 2 views
0

単純にintである私のviewmodelの辞書プロパティを反復するときに奇妙な 'Index out out Range'例外が発生しています。 。例外は、レイザービューで辞書を反復処理するときにのみ発生するため、奇妙です。私自身の正気のために、コントローラで全く同じ繰り返し処理を問題なく実行しました。asp.net MVC - 剃刀で辞書を反復するときに奇妙なインデックスが範囲外にある

 Debug.WriteLine("+++++++++++++++++++++++++++++"); 
     for (int i = 0; i < viewModel.PhaseTemplateDict.Keys.Count(); i++) 
     { 
      Debug.WriteLine("Phase Name: " + viewModel.PhaseTemplateDict.Values.ElementAt(i)[0].ProgramLevelName); 
      Debug.WriteLine(""); 

      for (int j = 0; j < viewModel.PhaseTemplateDict.Values.ElementAt(i).Count(); j++) 
      { 
       Debug.WriteLine("Goal Name: " + viewModel.PhaseTemplateDict.Values.ElementAt(i)[j].GoalDescription);      
      } 
      Debug.WriteLine("========================="); 
     } 
     Debug.WriteLine("+++++++++++++++++++++++++++++"); 

このコードでは、例外はありません。私は、テーブルを構築するために私のかみそりビューでほぼ同一の構造を使用する場合

+++++++++++++++++++++++++++++ 
Phase Name: Orientation 

Goal Name: Provider 
Goal Name: UAs 
Goal Name: P.O. Meeting 
Goal Name: Provider Assessment 
Goal Name: Court 
========================= 
Phase Name: Phase 1 

Goal Name: School/Work 
Goal Name: Treatment 
Goal Name: Curfew Checks 
Goal Name: PO Meetings 
Goal Name: UAs 
Goal Name: Court 
========================= 
Phase Name: Phase 2 

Goal Name: test1 
Goal Name: test2 
========================= 
Phase Name: Phase 3 

Goal Name: test1 
Goal Name: test2 
Goal Name: test3 
Goal Name: test4 
========================= 
+++++++++++++++++++++++++++++ 

はしかし、私は「System.ArgumentOutOfRangeExceptionがの取得 - インデックスが範囲外でした。負でなく、コレクションのサイズより小さくなければなりません。表示:この場合

@model MyApp.ViewModels.PhaseTemplatesViewModel 

@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    <div class="row"> 
     <div class="col-md-offset-3 col-md-5"> 
      @{ int index = 0;} 
      @for (int i = 0; i < Model.PhaseTemplateDict.Keys.Count(); i++) 
      { 
       <div class="row"> 
        <div class="panel panel-info"> 
         <div class="panel-heading"> 
          <h3 class="panel-title">@Model.PhaseTemplateDict.Values.ElementAt(i)[0].ProgramLevelName</h3> 
         </div> 
         <div class="panel-body"> 
          <table class="table table-striped table-hover"> 
           <thead> 
            <tr>           
             <th>Description</th> 
             <th>Points Required</th> 
             <th>Display Order</th> 
            </tr> 
           </thead> 
           <tbody> 
            @for (int j = 0; j < @Model.PhaseTemplateDict.Values.ElementAt(i).Count(); j++) 
            {           
             @Html.HiddenFor(mdlItem => @Model.PhaseTemplateDict.Values.ElementAt(i)[j].PointMatrixTemplateID, new { Name = "[" + index + "]." + "PointMatrixTemplateID" }) 
             @Html.HiddenFor(mdlItem => @Model.PhaseTemplateDict.Values.ElementAt(i)[j].ProgramLevel, new { Name = "[" + index + "]." + "ProgramLevel" }) 

             <tr> 
              <td> 
               @Html.TextBoxFor(mdlItem => @Model.PhaseTemplateDict.Values.ElementAt(i)[j].GoalDescription, new { @class = "form-control", Name = "[" + index + "]." + "GoalDescription" }) 
              </td> 
              <td> 
               @Html.TextBoxFor(mdlItem => @Model.PhaseTemplateDict.Values.ElementAt(i)[j].PointsRequired, new { @class = "form-control text-center", style = "width: 40px; padding: 0px", type = "number", Name = "[" + index + "]." + "PointsRequired" }) 
              </td> 
              <td> 
               @Html.TextBoxFor(mdlItem => @Model.PhaseTemplateDict.Values.ElementAt(i)[j].DisplayOrder, new { @class = "form-control text-center", style = "width: 40px; padding: 0px", type = "number", Name = "[" + index + "]." + "DisplayOrder" }) 
              </td> 
             </tr> 
             index++; 
            } 
           </tbody> 
          </table> 
         </div> 
         <div class="panel-footer"> 
          <button class="btn btn-primary" type="button" onclick="addGoalToTemplate(@Model.PhaseTemplateDict.Values.ElementAt(i)[i].ProgramLevel)">Add Goal</button> 
          <button class="btn btn-success" type="submit">Save</button>       
         </div> 
        </div> 
       </div> 
      } 
     </div> 
    </div> 

} 

例外は、すぐに実行が3回目のためのforループの内側の上部に達すると発生します。 Key [2](上記の 'Phase 2')にあります。リストの長さ(Dictionary Value)がマップされているDictionary Keyのインデックス以上である場合、Viewをレンダリングすることができました。たとえば上記のデバッグ出力では、 'Phase 2'は3番目のキーインデックス[2]にありますが、ValueリストのCountは2であるため、例外が発生します。不思議なことに、Valueリストに3以上のCountがあると、すべて正常に動作します。私はしばらくこの頭の上で頭を掻いてきたので、なぜこれが起こっているのかについての洞察は非常に高く評価されるでしょう。

+0

なぜそれを配列として扱うのであれば、それを辞書にするのはなぜですか?繰り返しを簡単にするために、私は辞書に 'foreach(var k in dict.Keys) 'のようなものを使用します。 – nurdyguy

答えて

1

Welp、私はかわいい感じです。このボタンのインデックスに

誤植が

<button class="btn btn-primary" type="button" onclick="addGoalToTemplate(@Model.PhaseTemplateDict.Values.ElementAt(i)[i].ProgramLevel)">Add Goal</button> 

があるべき問題を引き起こした:

<button class="btn btn-primary" type="button" onclick="addGoalToTemplate(@Model.PhaseTemplateDict.Values.ElementAt(i)[0].ProgramLevel)">Add Goal</button> 

私はちょうどから 'ElementAt'(I)[I]へのインデックスを変更します( i)[0]。

関連する問題