2010-11-20 10 views
0

Ich bin relativ neu zu Asp und habe dieses dumme Problem, das die ganze Zeit Null zurückgibt. Hier ist meine Funktion, die ich denke, ist ziemlich einfach. Ich habe Steven Sandersons Buch gelesen, das sehr hilfreich war. Wie auch immer, hier ist meine Funktion, die ich System.NullReferenceException danachÜbergeben eines Objekts in eine Klasse mit ASP MVC. Neuling!

public ActionResult Menu(string page) 
    { 
     Func<Pages, NavLink> makeLink = parentPage => new NavLink 
     { 
      Text = parentPage.PageTitle ?? "Home", 
      RouteValues = new RouteValueDictionary(new 
      { 
       controller = "Pages", 
       action = "List", 
      }), 
      IsSelected = (parentPage.PageTitle == page), 
      IsFirst = (parentPage.PageOrder == 1) 
     }; 

     List<NavLink> navlinks = new List<NavLink>(); 
     navlinks.Add(makeLink(null)); 

     foreach (var parent in pagesRepository.Pages.Where(x => x.PageParent == 0).OrderBy(x => x.PageOrder)) 
     { 
       navlinks.Add(makeLink(parent)); 
     } 

     return View(navlinks); 
    } 

Die obige Funktion erzeugt den folgenden Fehler erklären: Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

Wenn ich eine Zeichenfolge anstelle meiner Pages-Klasse überlasse, funktioniert es, jedoch muss ich auf einige Eigenschaften meiner Pages-Klasse zugreifen, um wesentliche Werte zurückzugeben. Die folgende Funktion gibt keinen Fehler zurück

public ActionResult Menu(string page) 
    { 
     Func<string, NavLink> makeLink = parentPage => new NavLink 
     { 
      Text = parentPage ?? "Home", 
      RouteValues = new RouteValueDictionary(new 
      { 
       controller = "Pages", 
       action = "List", 
      }), 
      IsSelected = (parentPage == page) 
     }; 

     List<NavLink> navlinks = new List<NavLink>(); 
     navlinks.Add(makeLink(null)); 

     foreach (var parent in pagesRepository.Pages.Where(x => x.PageParent == 0).OrderBy(x => x.PageOrder)) 
     { 
       navlinks.Add(makeLink(parent.PageTitle)); 
     } 

     return View(navlinks); 
    } 

Vielen Dank und Ihre Hilfe wird sehr geschätzt werden !!

Antwort

2

Sie passieren null wenn die Funktion hier aufrufen:

navlinks.Add(makeLink(null)); 

So müssen Sie dagegen schützen:

Func<Pages, NavLink> makeLink = parentPage => new NavLink 
{ 
    Text = (parentPage != null) ? (parentPage.PageTitle ?? "Home") : "", 
    RouteValues = new RouteValueDictionary(new 
    { 
     controller = "Pages", 
     action = "List", 
    }), 
    IsSelected = (parentPage != null) ? (parentPage.PageTitle == page) : false, 
    IsFirst = (parentPage != null) ? (parentPage.PageOrder == 1) : 0 
}; 

oder einfach nie mit Null-Argument nennen. Also statt:

List<NavLink> navlinks = new List<NavLink>(); 
navlinks.Add(makeLink(null)); 

foreach (var parent in pagesRepository.Pages.Where(x => x.PageParent == 0).OrderBy(x => x.PageOrder)) 
{ 
     navlinks.Add(makeLink(parent)); 
} 

return View(navLinks); 

können Sie einfach:

var navlinks = pagesRepository 
    .Pages 
    .Where(x => x.PageParent == 0) 
    .OrderBy(x => x.PageOrder) 
    .Select(makeLink); 
return View(navLinks); 
+0

Cant diesen Fehler glauben. Du bist ein Genie und ein Beweis dafür, warum ich nie spät in der Nacht programmieren sollte! Danke, Dasin! – Tyrone

Verwandte Themen