2016-10-21 5 views
0

Ich habe eine Suchfunktion erstellt, um den Produktnamen anzuzeigen. Aber in meiner Ansicht zeigt es den Fehler bei foreach. Ich verstehe nicht, warum es Objektreferenz nicht auf eine Instanz eines Objekts zurückgibt.MVC 4 C#: Objektreferenz nicht auf eine Instanz eines Objekts gesetzt

Hier ist der Fehler: enter image description here Hier ist mein Controller:

public ActionResult _searchPartial() 
    { 
     List<tblProduct> getProduct = new List<tblProduct>(); 
     getProduct = db.tblProducts.ToList(); 
     return View("_searchPartial", getProduct); 
    } 

    [HttpPost] 
    public ActionResult _searchPartial(string getProductName) 
    { 
     List<tblProduct> getProduct = new List<tblProduct>(); 
     getProduct = db.tblProducts.Where(m => m.ProductName.Contains(getProductName)).ToList(); 
     return View("_searchPartial", getProduct); 
    } 

die Ansicht:

@model IEnumerable<JAx_Collections.Models.tblProduct> 

<table style="text-align:center";> 
     <tr>  
      <th>Product Name</th> 
     </tr> 
      @foreach (var m in Model) 
      { 
     <tr> 
      <td>@m.ProductName</td> 
     </tr> 
      } 
</table> 

Das Modell:

namespace JAx_Collections.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class tblProduct 
    { 
     public int ProductID { get; set; } 
     public int SupplierID { get; set; } 
     public int CategoryID { get; set; } 
     public string ProductName { get; set; } 
     public int UnitPrice { get; set; } 
     public int UnitsInStock { get; set; } 
     public int UnitOnOrder { get; set; } 

     public virtual tblCategory tblCategory { get; set; } 
     public virtual tblSupplier tblSupplier { get; set; } 
    } 
} 
+0

Eine 'foreach' ist syntaktischer Zucker für das, was im Wesentlichen zu einem Aufruf von' GetEnumerator() 'wird. Ihr 'Model' ist in Ihrem GET null. Haben Sie versucht, einen Haltepunkt in der return-Ansicht ("_ searchPartial", getProduct) zu setzen? Zeile in der GET-Aktionsmethode, um sicherzustellen, dass "getProduct" nicht null ist? Sie könnten denken, es wird nicht Null sein, weil Sie es initialisiert haben. Aber buchstäblich die Zeile nach der Initialisierung, die Sie ihren Wert auf etwas anderes ... setzen, die 'null' sein kann. –

+0

@SimonWithehead wie man eine Bruchstelle setzt? Ich bin gerade neu in C# Programmierung – progammer101

+0

Sie würden gut tun, einige grundlegende Debugging zu lernen, bevor Sie in ein MVC-Projekt springen. Es wird Ihnen viel Zeit sparen. [Hier finden Sie einen MSDN-Artikel zur Verwendung von Haltepunkten] (https://msdn.microsoft.com/en-us/library/5557y8b4.aspx). –

Antwort

1

Dieser Fehler auch als NRE bekannt (NullReferenceException), siehe What is a NullReferenceException, and how do I fix it?.

In Ihrem Problem gibt die GET-Methode vom Controller eine Liste aus dem Datenbankkontext (tblProducts) zurück, der möglicherweise null enthält, wenn keine Ergebnisse bereitgestellt werden. Sie können eine if-Bedingung zu prüfen, gegen NULL-Verweis vor der Rückkehr Ansicht hinzufügen:

public ActionResult _searchPartial() 
    { 
     List<tblProduct> getProduct = new List<tblProduct>(); 
     getProduct = db.tblProducts.ToList(); 
     if (getProduct != null) 
     { 
      return View("_searchPartial", getProduct); 
     } 
     else 
     { 
      return View("_searchPartial"); // return without passing model 
     } 
    } 

Auch in der Ansicht, verwenden die gleiche Art und Weise Anwesenheit von null weitergegeben Modell zu überprüfen:

@model IEnumerable<JAx_Collections.Models.tblProduct> 

<table style="text-align:center";> 
     <tr>  
      <th>Product Name</th> 
     </tr> 
     @if (Model != null) 
     { 
      foreach (var m in Model) 
      { 
      <tr> 
       <td>@m.ProductName</td> 
      </tr> 
      } 
     } 
</table> 

Denken Sie daran, dass alle Referenztypen vor dem Übergeben an eine Ansicht auf den Nullwert überprüft werden sollten, insbesondere wenn die Sammeliteration auf der Ansichtsseite erfolgt.

+0

'.ToList()' kann 'null' nicht zurückgeben - nur eine leere Sammlung. Es kann nur die Ausnahme auslösen, wenn die Quelle ("db.tblProducts") "null" (unzugänglich) –

+0

IMHO ist, OP erfordert zusätzliche Überprüfung mithilfe von 'getProduct.Count> 0' im Controller-Code, um zu überprüfen, ob die Sammlung Null zählt . Wenn der Nullwert aus dem Kontext "tblProducts" stammt, auf den nicht zugegriffen werden kann, sollte der NRE-Break auch auf die Zuweisung "getProduct" und nicht auf die Ansicht "Model" in der Ansicht zeigen. –

+1

Es braucht das überhaupt nicht - wenn es keine Elemente gibt, wird die 'foreach' nicht ausgeführt. Und OP hat den relevanten Code nicht gezeigt (der gezeigte Code wird diese Ausnahme nicht werfen). Und das nächste Mal, Flagge oder Stimme zu schließen, wie ein Betrogener –

Verwandte Themen