2016-10-21 4 views
-1

ich eine Liste in einer anderen Liste erstellt habe, etwa so:ASP.NET-Schleife durch eine Liste innen und eine andere Schleife

var collectionsList = db.Data.ToList().Select(m => new { m.collection, m.hidden }).Where(model => model.hidden == false).Distinct(); 

      foreach (var item in collectionsList) 
      { 
       ViewData.Add(new KeyValuePair<string, object>(item.collection, db.Data.ToList().Where(model => model.collection == item.collection))); 
      } 

      return View(); 

Nun meiner Meinung nach Ich versuche, durch Viewdata zu Schleife und dann die Schleife durch die Listen im Innern die Bildschirmtextsystem wie folgt:

var collectionsList = db.Data.ToList().Select(m => new { m.collection, m.hidden }).Where(model => model.hidden == false).Distinct(); 

     foreach (var item in collectionsList) 
     { 
      ViewData.Add(new KeyValuePair<string, object>(item.collection, db.Data.ToList().Where(model => model.collection == item.collection))); 
     } 

     return View(); 


@foreach (var item in ViewData) 
      { 
       <h1 style="padding-bottom:50px;">item.Key</h1> 
       <table class="table"> 
       <tr style="border-bottom: 1px solid #333;"> 
        <th> 
         Design 
        </th> 
        <th> 
         Size (sq ft.) 
        </th> 
        <th style="text-align: right;"> 
         Price 
        </th> 
       </tr> 
       @foreach(var x in item.Value as List<CP.Models.Pricing>) 
       { 
        <tr> 
         <td> 
          @Html.DisplayFor(modelItem => x.name) 
         </td> 
         <td> 
          @Html.DisplayFor(modelItem => x.sqft) sq ft. 
         </td> 
         <td style="text-align: right;"> 
          [email protected](modelItem => x.basePrice) 
         </td> 
        </tr> 
       } 
       </table> 
      } 

Aber ich habe diesen Fehler auf der zweiten Schleife: Object reference not set to an instance of an object. Warum erhalte ich diesen Fehler? und wie kann ich es reparieren?

+0

welche Zeile, speziell - so ziemlich eine der einfachsten Fehlermeldungen in .net zu; Jede Zeile, die den Fehler verursacht, hat ein Null-Objekt, auf das Sie eine Eigenschaft verweisen möchten. – Darren

+0

diese Zeile .... @ foreach (var x in item.Value als Liste ) – user2551750

+0

so entweder Wert ist null oder Element ist null. Sie brauchen auch nicht den 'as' Teil – Darren

Antwort

0

x ist null? Ihr @ Html.Display verursacht einen Fehler.

Ich würde vorschlagen, eine einfache Versuch-und-Fehler-Eliminierung, d. H. Kommentar der DisplayFor und sehen, ob der Fehler verschwindet. Dies wird helfen, die Ursache einzugrenzen.

0

Sie verwenden "ViewData" anstelle von "ViewData [" KeyName "]". Wenn Sie nur ViewData verwenden, werden alle ViewData-Werte zusammen mit den erforderlichen Daten berücksichtigt. zum Beispiel WEBPAGE TITLE wird auch in foreach-Schleife gehen. Das könnte das Problem verursachen.

Ich würde vorschlagen, dass Sie "ViewData [" KeyName "]" anstelle von ViewData angeben. Damit wird die Schleife nur für den angegebenen ViewData-Schlüssel ausgeführt.

Beispielcode, der alle in Ordnung für mich arbeitet, ist wie folgt:

Viewdata-Deklaration und Zuweisung

ViewDataDictionary vd = new ViewDataDictionary(); 
List<string> lst = new List<string>(); 
lst.Add("Data1User1"); 
lst.Add("Data2User1"); 
lst.Add("Data3User1"); 
lst.Add("Data4User1"); 
vd.Add("User1", lst); 

lst = new List<string>(); 
lst.Add("Data1User2"); 
lst.Add("Data2User2"); 
vd.Add("User2", lst); 

ViewData["vdt"] = vd; 

Razor-Code in einer Schleife durch eine Liste im Inneren und eine andere Schleife

@foreach (var vdt in ViewData["vdt"] as ViewDataDictionary) 
{ 
    <h1 style="padding-bottom: 50px;"> @vdt.Key </h1> 

    <table class="table"> 
     <tr style="border-bottom: 1px solid #333;"> 
      <th>Design 
      </th> 
     </tr> 
     @foreach (var x in vdt.Value as List<string>) 
     { 
      <tr> 
       <td> 
        @x 
       </td> 
      </tr> 
     } 
    </table> 
} 

Bitte folgen Sie den oben genannten Ansatz und corre ct du Code.

Ich hoffe, dies wird Ihnen helfen und bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Verwandte Themen