2016-04-09 10 views
0

Ich bin neu in Asp Net und ich habe ein paar Fragen. Also mache ich ein Beispiel, um zu verstehen, dieses Beispiel gibt eine TempData mit dem Übereinstimmungsnamen in der Liste zurück. Die Liste enthält 3 Objekte, die im actionResult-Index erstellt wurden.Warum erhalte ich eine NullReference Exception in TempData

[HttpPost] 
    public ActionResult Buscar(String NomeP) 
    { 
     int i; 
     List<Models.Produto> Lista = null; 

     Lista = Session["SSLista"] != null ? (Session["SSLista"] as List<Models.Produto>) : new List<Models.Produto>(); 
     for (i = 0; i< Lista.Count; i++) { 
      if (Lista[i].Nome.Equals(NomeP)) { 
       TempData["Found"] = Lista[i]; 
      } 
     } 
     return RedirectToAction("Produto", "Home"); 

}

Wenn ich versuche, die Rückkehr zu zeigen ich diese Ausnahme von Nullreference erhalten, aber die TempData einige Daten im Gegenzug hat.

<% Html.EndForm(); %> <%

if (TempData["Found"] != null) 
{ %> 
<% 
foreach (var prod in (TempData["Found"] as List<MvcApplication2.Models.Produto>)) 
{ 
%> 
<br /> 
<h2>Produtos</h2> 
<label> 
    Nome: <%=prod.Nome %> 
</label> 
<label> 
    Descrição <%= prod.Descricao%> 
</label> 
<label> 
    Preço: <%= prod.Valor_unitario%> 
</label> 
<label> 
    ID: <%= prod.Id%> 
</label><br> 
<% } 
} 

Das Bild unten zeigen ist, dass TempData einige Daten, aber ich kann in der foreach konvertieren.

+1

Keine Ahnung, warum Sie eine falsche Antwort akzeptiert hat, die nichts mit Ihrem Problem zu tun hat. TempData ["Found"] = Lista [i]; 'fügt TempData (keine Sammlung) ein einzelnes' Produto' hinzu. Dann in der Ansicht, die Sie versuchen und werfen einen einzigen 'Produto' zu' Liste 'was natürlich nicht und seine' null' –

Antwort

0

TempData: Ist in der Regel passierte Daten zwischen einer Aktionsmethode zum anderen verwendet, wenn Sie Daten zu übergeben von der Steuerung wollen ViewBag oder Bildschirmtextsystem anzuzeigen, zu verwenden.


Anyways das Problem, das Sie gerade zu Ihrem TempData zuweisen wird, wird

TempData["Found"] = Lista[i]; 

Nach dem for-Schleife der TempData hat gerade den letzten iterierter Artikel in ihm, und in Ihrer Ansicht nach versuchen Sie zu werfen zu List<Models.Produto>

foreach (var prod in (TempData["Found"] as List<MvcApplication2.Models.Produto>)) 

Welches ist das Problem.

Versuchen Sie, diese

[HttpPost] 
    public ActionResult Buscar(String NomeP) 
    { 
     int i; 
     List<Models.Produto> Lista = null; 
     List<Models.Produto> TempList = new List<Models.Produto>(); //new variable 

     Lista = Session["SSLista"] != null ? (Session["SSLista"] as List<Models.Produto>) : new List<Models.Produto>(); 
     for (i = 0; i< Lista.Count; i++) { 
      if (Lista[i].Nome.Equals(NomeP)) { 
       TempList.Add(Lista[i]); // add the items to the temp list 
      } 
     } 

     TempData["Found"] = TempList; //assign the final list to temp data 
     return RedirectToAction("Produto", "Home"); 
} 

Auch ich dies nach yildizm85 darauf hingewiesen, herausgefunden. Also alle Credits für ihn. Ich habe meine Antwort aktualisiert, um weitere Abstimmungen zu vermeiden.

+0

Also, wenn ich das Viewdata verwenden, kann ich die Daten in der Ansicht bekommen? aber auf diese Weise muss ich die Rückkehr zu Ansicht ändern. So was ? Rückansicht(); –

+0

Ja, aber ich sehe, dass Sie auf eine andere Aktion umleiten, die wiederum zu Ihrer Ansicht führt, oder? Zuerst müssen Sie auf die Tempdata in Ihrer 'Produto'-Aktion zugreifen und sie dann erneut einem ViewBag zuweisen. Hier gehen Sie den Abschnitt, wo es über TempData erklärt http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-CplusViewBagplusandplusTem –

+0

Ich modifiziere und eine ViewData in der Aktion Produto, ich empfange die Daten in der Ansicht richtig. Aber im foreach convert habe ich noch die Ausnahme.foreach (var prod in (ViewData ["Gefunden"] als Liste )). Danke für die Hilfe –

2

sollten Sie in der Lage sein, die null zu finden, die durch einfaches Debuggen von Code, um den NullReferenceException Wert verursacht. Und Sie sollten auch angeben, auf welche Ansicht Sie zugreifen möchten.

In der aktuellen Situation setzen Sie die einzelnen Instanzen von jedoch auf TempData["Found"], sondern auf List<MvcApplication2.Models.Produto>, was eine Nullreferenz ergibt.

Try TempData["Found"] = Lista; in der Steuerung einstellen.

Verwandte Themen