2014-10-27 42 views
12

nel collegamento a discesa di associazione in mvc ottengo sempre questo errore Non esiste un elemento ViewData di tipo paese 'IEnumerable' che ha la chiave non so come a risolverloNon esiste un elemento ViewData di tipo 'IEnumerable <SelectListItem>' che ha il codice chiave

View

@Html.DropDownList("country", 
    (IEnumerable<SelectListItem>)ViewBag.countrydrop,"Select country") 

controller

List<Companyregister> coun = new List<Companyregister>(); 
coun = ds.getcountry(); 

List<SelectListItem> item8 = new List<SelectListItem>(); 
foreach(var c in coun) 
{ 
    item8.Add(new SelectListItem 
    { 
     Text = c.country, 
     Value = c.countryid.ToString() 
    }); 
} 

ViewBag.countrydrop = item8; 
return View(); 

Non so dove im sbagliato, qualcuno mi può aiutare grazie in anticipo

+0

ho aggiornato il mio codice controllarlo. –

+3

Se si verifica questo errore, significa che il valore di 'ViewBag.coutrydrop' è' null'. O il codice per popolarlo non viene eseguito, o questo si verifica solo quando si registra e si restituisce la vista (e non si è ancora popolato 'ViewBag.countrydrop') –

+1

E si consideri la semplificazione del codice in' ViewBag.countrydrop = new SelectList (coun, "countryid", "country"); 'e' @ Html.DropDownList ("country", (SelectList) ViewBag.countrydrop, ...) ' –

risposta

11

Nella vostra azione cambiamento ViewBag.countrydrop = item8-ViewBag.country = item8; e in vista scrivete come questo :

@Html.DropDownList("country", 
        (IEnumerable<SelectListItem>)ViewBag.country, 
        "Select country") 

In realtà quando si scrive

@ Html.DropDownList ("paese", (IEnumerable) ViewBag.country, "Scegli il Paese")

o

Html.DropDownList ("Paese", "Selec t Paese)

sembra dentro per IEnumerable<SelectListItem> in ViewBag con chiave paese, è anche possibile utilizzare questo sovraccarico in questo caso:

@Html.DropDownList("country","Select country") // it will look for ViewBag.country and populates dropdown 

Vedi Working DEMO Example

0

provare questo

@Html.DropDownList("ddlcountry",(List<SelectListItem>)ViewBag.countrydrop,"Select country") 

controller

ViewBag.countrydrop = ds.getcountry().Select(x => new SelectListItem { Text = x.country, Value = x.countryid.ToString() }).ToList(); 
+0

non ha mai funzionato –

+0

sei in grado di ottenere paesi nell'elenco? –

+0

breakpoint stesso non chiama mai @ManishSharma –

1

uso questo

var list = new SelectList(countryList, "Id", "Name"); 
ViewBag.countries=list; 
@Html.DropDownList("countries",ViewBag.Roles as SelectList) 
2

Si noti che un elenco di selezione viene registrato come null, quindi il tuo errore si lamenta che la proprietà viewdata non può essere trovata.

Reinizializza sempre l'elenco di selezione in un'azione POST.

Per ulteriori spiegazioni: Persist SelectList in model on Post

8

Se si sta utilizzando DropDownListFor come questo:

@Html.DropDownListFor(m => m.SelectedItemId, Model.MySelectList) 

dove MySelectList nel modello è stata una proprietà di tipo SelectList, questo errore potrebbe essere generata se la proprietà era null.

evitare questo semplice inizializzazione nel costruttore, come questo:

public MyModel() 
{ 
    MySelectList = new SelectList(new List<string>()); // empty list of anything... 
} 

io so che non è il caso del PO, ma questo potrebbe aiutare uno come me che ha avuto lo stesso errore a causa di questo.

+0

O qualcosa del genere: MySelectList = new List (); – Sanchitos

+1

Scenario troppo comune: si verifica un errore su POST, quindi si restituisce il modello di visualizzazione alla pagina con un errore. Ma non hai aggiornato l'Elenco che è stato perso nel POST, quindi sono nulli. Invece di un null-ref, ottieni un errore veramente fuorviante dalla vista che dice che alcune proprietà non sono di un tipo particolare quando sai perfettamente che non dovrebbe essere di quel tipo ecc. – mmcrae

+0

@mmcrae esattamente, ho avuto questo problema un paio di volte con l'azione POST, in cui ho dimenticato di popolare nuovamente i miei elementi a discesa. – Alisson

0

Ho avuto lo stesso problema e ho trovato la soluzione che dovrei inserire il codice per recuperare l'elenco a discesa dal database nel metodo di modifica. Ha funzionato per me. Solution for the similar problem

0

Nel mio caso, si è verificato l'errore perché non avevo inizializzato nella lista di selezione nel controller come questo:

viewModel.MySelectList = new List<System.Web.Mvc.SelectListItem>(); 

quanto nessuna delle risposte esistenti reso questo chiaro per me, io questo post. Forse aiuta qualcuno.

Problemi correlati