2013-08-01 14 views
7

Ho una lista nel controllerLinq non funziona in MVC View

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

ViewBag.linkList = myList; 

E poi in vista che sto cercando di fare

@ViewBag.linkList.First() 

E mi sta dando l'errore: 'System.Collections.Generic.List' non contiene una definizione per 'First'

Se faccio

@ViewBag.linkList[0]

Funziona bene.

Ho già inserito @using System.Linq nella vista. Mi sto perdendo qualcosa? Linq funziona all'interno della vista?

+2

Non si tratta della tua risposta, solo un suggerimento .. Penso che il modo migliore non sia ViewBag, ricerca ViewModel .. – yusuf

+0

Inoltre, la tua vista non è il posto giusto per una logica come questa. –

risposta

9

ViewBag è dinamico. First() è un metodo di estensione su IEnumerable<T>. I metodi di estensione non funzionano su riferimenti dinamici.

È necessario prima trasmettere l'elenco a IEnumerable<string> prima di chiamare First().

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

Nota quella pianura IEnumerable non funziona, dal momento che .First() non è definito per esso.

+0

Funziona, grazie. –

1

Prova a trasmettere ai IEnumerable<T>, in questo modo:

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

o per List<string>:

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

Il ViewBag è un oggetto dynamic ... Più specificamente, un ExpandoObject. Immagino che il raccoglitore dinamico stia avendo difficoltà a identificare il tipo originale.

+0

In qualche modo questo cast non funziona, ma @ ((ViewBag.linkList as IEnumerable ) .First()) funziona. –

1

È necessario passare l'elenco nella vista tramite un ViewModel. Nella sua forma più semplice passare l'elenco nella vista dal controller es. return View(myList);

Nella vista aggiungere @model = List<string> nella parte superiore della pagina. È quindi possibile utilizzare Model.First() model.First() per ottenere l'elemento desiderato.

I ViewModels possono essere creati come classi o strutture, o solo tipi di dati semplici, tuttavia il vantaggio è che sono fortemente tipizzati quando entrano nella Vista.