235 messaggi dal 27 aprile 2009
Ciao a tutti, volevo popolare una DropDownList, nella caricamento della pagina popolo un oggetto List<SelectListItem>()
            Category ca = new Category();
            List<Categoria> lsImage = ca.getListCategorie();
            List<SelectListItem> slItem = new List<SelectListItem>();
            foreach (Categoria cat in lsImage.ToList())
            {
                SelectListItem slcategoria = new SelectListItem();
                slcategoria.Value = cat.CategoriaId.ToString();
                slcategoria.Text = cat.CategoriaName;
                slItem.Add(slcategoria);
            }

            ViewData["MyListCategoria"] = slItem;
            return View();


a questo punto pensavo di fare una cosa cosi

@Html.DropDownListFor("CategoriaId", ((List<SelectListItem>)ViewData["MyListCategoria"]));

Ovviamente non va, consigli :)
Grazie :)
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, utilizza l'altro html helper, Html.DropDownList.

@Html.DropDownList("CategoriaId", ((List<SelectListItem>)ViewData["MyListCategoria"]));


Il .DropDownListFor invece serve a legare la dropdownlist alla proprietà della classe che hai passato alla View. Saprai che le view possono essere tipizzate e che dall'action gli puoi passare un'istanza del tipo che hai dichiarato. Esempio:

var prodotto = new Prodotto();
prodotto.Nome = "Pentola a pressione";
prodotto.CategoriaId = 4;
return View(prodotto);


Affinché poi, il model binder di MVC sappia poi come ricostruire l'oggetto "Prodotto" in base dati che ha ricevuto dal form, si usa appunto .DropDownListFor e tutti gli altri helper tipo .TextBoxFor, .CheckBoxFor, ecc...

@Html.DropDownListFor(model => model.CategoriaId, ((List<SelectListItem>)ViewData["MyListCategoria"]));


ciao

Enjoy learning and just keep making
235 messaggi dal 27 aprile 2009
Mi sfugge ancora qualcosa.
nel mio Model ho questo :
 public class Categoria : Category
    {
        public int CategoriaId { get; set; }
        public int CategoriaIdParent { get; set; }
        public string CategoriaName { get; set; }
    }


che viene popolato durante il caricamento della pagina

   Category ca = new Category();
            List<Categoria> lsImage = ca.getListCategorie();
            List<SelectListItem> slItem = new List<SelectListItem>();
            foreach (Categoria cat in lsImage.ToList())
            {
                SelectListItem slcategoria = new SelectListItem();
                slcategoria.Value = cat.CategoriaId.ToString();
                slcategoria.Text = cat.CategoriaName;
                slItem.Add(slcategoria);
            }

            ViewData["MyListCategoria"] = slItem;
            return View();


e nella view come consigliato
     @Html.DropDownList("CategoriaId", ((List<SelectListItem>)ViewData["MyListCategoria"]));


però mi da un errore
There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'CategoriaId'.

:(
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, sembra tutto corretto, sei sicuro che l'errore capiti in corrispondenza di questa linea?
@Html.DropDownList("CategoriaId", ((List<SelectListItem>)ViewData["MyListCategoria"]))


L'errore vuol dire questo: l'htmlhelper .DropDownList valuta ViewData["MyListCategoria"] ma questa espressione gli restituisce null, come se nessun valore fosse stato assegnato alla chiave "MyListCategoria" dal codice contenuto nella action, e così cerca di capire se nella collezione ViewData esiste invece una chiave chiamata "CategoriaId" da cui possa ottenere la collezione di SelectListItem. Dato che non riesce a trovare neanche quella, ecco che è costretto a lanciare l'errore.

Non è che magari hai un altro Html.DropDownList nella pagina, oltre a quello, che possa dare il problema? Oppure c'è qualche lieve discrepanza tra il codice che hai postato e quello che è effettivamente nella tua pagina? Altrimenti non me lo spiego.

Col debugger, quando si verifica l'errore, cerca di capire qual è l'esatta riga incriminata e poi ispeziona il suo secondo parametro ViewData["nomechiave"] e vedrai che è null.

Se non si riesce a venirne a capo, prova a passarti i dati da action a view con ViewData["CategoriaId"], anziché ViewData["MyListCategoria"].

E' una soluzione momentanea, ovviamente, perché il codice che hai postato già dovrebbe funzionare senza problemi.

ciao,

Enjoy learning and just keep making
235 messaggi dal 27 aprile 2009
Avevi proprio ragione :) ora funziona tutto perfettamente.
Non entrava nella funzione per cui mi il View era vuoto :)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.