2013-08-01 9 views
7

Ich habe eine Liste in der SteuerungLinq funktionieren nicht in MVC-Ansicht

List<string> myList = new List<string>(); 
myList.Add(aString); 

ViewBag.linkList = myList; 

Und dann in der Ansicht I

@ViewBag.linkList.First() 

zu tun versuchen Und es wird mir den Fehler geben: 'System.Collections.Generic.List' enthält keine Definition für 'First'

Wenn ich

@ViewBag.linkList[0]

Es funktioniert gut.

Ich habe bereits in der Ansicht. Fehle ich etwas? Arbeitet Linq in der Ansicht?

+2

Es geht nicht um Ihre Antwort, nur ein Vorschlag .. Ich denke, der beste Weg ist nicht ViewBag, Forschung ViewModel .. – yusuf

+0

Auch Ihre Ansicht ist nicht der Ort für Logik wie folgt. –

Antwort

9

ViewBag ist dynamisch. First() ist eine Erweiterungsmethode unter IEnumerable<T>. Erweiterungsmethoden funktionieren nicht bei dynamischen Referenzen.

Sie müssen Ihre Liste zunächst an IEnumerable<string> vor dem Aufruf First() umwandeln.

@((ViewBag.linkList as IEnumerable<string>).First()) 

Beachten Sie, dass Ebene IEnumerable wird nicht funktionieren, da .First() ist nicht für sie bestimmt.

+0

Es funktioniert, danke. –

1

Versuchen Sie es zu IEnumerable<T>, wie das Gießen:

@((IEnumerable<string>)ViewBag).linkList.First() 

oder List<string>:

@((List<string>)ViewBag).linkList.First() 

Die ViewBag ist ein dynamic Objekt ... Genauer gesagt ein ExpandoObject. Ich vermute, dass der dynamische Binder Schwierigkeiten hat, den ursprünglichen Typ zu identifizieren.

+0

Irgendwie funktioniert dieser Cast nicht, aber @ ((ViewBag.linkList als IEnumerable ) .First()) funktioniert. –

1

Sie sollten die Liste über ein ViewModel in die Ansicht übernehmen. In seiner einfachsten Form übergeben Sie die Liste in der Ansicht von der Steuerung z. return View(myList);

In der Ansicht hinzufügen @model = List<string> am Anfang der Seite. Sie können dann Model.First() model.First() verwenden, um das gewünschte Element zu erhalten.

ViewModels können als Klassen oder Strukturen oder einfache Datentypen erstellt werden. Der Vorteil ist jedoch, dass sie stark typisiert werden, wenn sie in die Ansicht gelangen.