2011-01-02 9 views
22

Sto lavorando a un'applicazione Web MVC3. Voglio un elenco di categorie mostrato quando si modifica un blo dal sistema di gestione delle applicazioni. Nel mio viewmodel ho definito la seguente proprietà per un elenco di selectlistitems per le categorie.C# mvc 3 utilizzando la selezione con il valore selezionato in vista

Il passaggio successivo, il mio controller contiene la seguente azione di modifica in cui l'elenco di selectlistitems viene compilato dal database.

public ActionResult Edit(Guid id) 
{ 
    var blogToEdit = _blogService.First(x => x.Id.Equals(id)); 
    var listOfCategories = _categorieService.GetAll(); 
    var selectList = listOfCategories.Select(x =>new SelectListItem{Text = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)}).ToList(); 
    selectList.Insert(0, new SelectListItem{Text = Messages.SelectAnItem, Value = Messages.SelectAnItem}); 

    var viewModel = new BlogModel 
         { 
          BlogId = blogToEdit.Id, 
          Active = blogToEdit.Actief, 
          Content = blogToEdit.Text, 
          Title = blogToEdit.Titel, 
          Categories = selectList //at this point i see the expected item being selected 
          //Categories = new IEnumerable<SelectListItem>(listOfCategories, "Id", "Naam", blogToEdit.CategorieId) 
         }; 
    return View(viewModel); 
} 

quando ho creato un punto di interruzione poco prima della visualizzazione viene restituito, vedo che il SelectList è pieno come mi aspettavo. Quindi a questo punto tutto sembra essere a posto. Il viewmodel è completamente riempito. Poi a mio avviso (sto usando Razor) ho le seguenti due regole che dovrebbero rappresentare la selectlist per me.

@Html.LabelFor(m => m.Categories) @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) 
@Html.ValidationMessageFor(m => m.Categories) 

Quando eseguo il codice e apro la vista per modificare il mio blog, posso vedere tutti i dati corretti. Anche l'elenco di selezione viene reso correttamente, ma l'elemento che voglio essere selezionato ha perso la sua selezione. Come può essere? Fino al momento in cui il viewmodel viene restituito con la vista, tutto va bene. Ma quando guardo la pagina web nel browser, la selectlist è lì solo con la selezione corretta. Cosa mi manca qui? O stai sbagliando?

risposta

50
@Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) 

Qui non si utilizza correttamente il metodo di supporto. Il primo argomento deve essere una proprietà sul tuo modello di vista che conterrà il valore attualmente selezionato. Dovrebbe essere una proprietà scalare, non una collezione.

Quindi nel tuo modello di vista è necessario aggiungere tali beni:

[Display(Name = "Categorie")] 
public IEnumerable<SelectListItem> Categories { get; set; } 
public string SelectedValue { get; set; } 

E nella vostra azione di controllo:

var selectList = listOfCategories.Select(x => new SelectListItem { 
    Text = x.Name, 
    Value = x.Id.ToString() 
}).ToList(); 

var viewModel = new BlogModel 
{ 
    BlogId = blogToEdit.Id, 
    Active = blogToEdit.Actief, 
    Content = blogToEdit.Text, 
    Title = blogToEdit.Titel, 
    Categories = selectList, 
    // this is what sets the selected value 
    SelectedValue = blogToEdit.Category.Id 
}; 

E secondo lei semplicemente:

@Html.DropDownListFor(x => x.SelectedValue, Model.Categories) 
+0

Piuttosto sicuro che hai ragione, tuttavia, la proprietà dovrebbe essere denominata CategoryId, non SelectedValue (lo so, un po 'di nitpick, +1 in ogni caso :)) –

+0

Grazie per la risposta rapida e molto chiara! Ha funzionato alla grande! – Rob

+0

@Chris Shaffer, sì sono d'accordo sul fatto che sarebbe meglio chiamare 'CategoryId' invece di' SelectedValue' in quanto riflette meglio il suo scopo. –

1

I Sono abbastanza sicuro di aver usato la proprietà = true selezionata di un elemento di elenco selezionato con un buon effetto prima. Un problema che avevo era un valore in conflitto in ViewData.

+0

Sì, ma quello era con MVC2. Questa soluzione funziona, quindi sono felice – Rob

Problemi correlati