web-dev-qa-db-fra.com

C # mvc 3 utilisant selectlist avec la valeur sélectionnée en vue

Je travaille sur une application Web MVC3. Je veux une liste des catégories affichées lors de l'édition d'un blo à partir du système de gestion des applications. Dans mon viewmodel, j'ai la propriété suivante définie pour une liste de selectlistitems pour les catégories.

/// <summary>
/// The List of categories
/// </summary>
[Display(Name = "Categorie")]
public IEnumerable<SelectListItem> Categories { get; set; }

L'étape suivante, mon contrôleur contient l'action d'édition suivante où la liste de selectlistitems est remplie à partir de la base de données.

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);
}

Lorsque je fixe un point d'arrêt juste avant le retour de la vue, je constate que la liste de sélection est remplie comme je m'y attendais. Donc, à ce stade, tout semble aller bien. Le viewmodel est rempli entièrement correct. Ensuite, à mon avis (j'utilise Razor), j'ai les deux règles suivantes qui sont censées rendre la liste de sélection pour moi.

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

Lorsque j'exécute le code et ouvre la vue pour modifier mon blog, je peux voir toutes les données correctes. La liste de sélection est également rendue correctement, mais l'élément que je souhaite sélectionner a été perdu. Comment se peut-il? Jusqu'au moment où le modèle de vue est renvoyé avec la vue, tout va bien. Mais lorsque je consulte la page Web dans le navigateur, la liste de sélection n'est là qu'avec la sélection correcte. Qu'est-ce que j'oublie ici? Ou mal?

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

Ici, vous n'utilisez pas correctement la méthode d'assistance. Le premier argument doit être une propriété de votre modèle de vue qui contiendra la valeur actuellement sélectionnée. Ce doit être une propriété scalaire, pas une collection.

Donc, dans votre modèle de vue, vous devez ajouter une telle propriété:

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

Et dans l'action de votre contrôleur:

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 
};

Et selon vous simplement:

@Html.DropDownListFor(x => x.SelectedValue, Model.Categories)
51
Darin Dimitrov

Je suis presque sûr d'avoir déjà utilisé la propriété selected = true d'un élément de liste de sélection avec succès. Un problème que j'ai eu était une valeur conflictuelle dans ViewData.

1
nick