С# mvc 3 с использованием списка избранного с выбранным значением

Я работаю над веб-приложением MVC3. Я хочу список категорий, отображаемых при редактировании blo из системы управления приложениями. В моей модели просмотра у меня есть следующее свойство, определенное для списка selectlistitems для категорий.

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

Следующий шаг, мой контроллер содержит следующее действие редактирования, в котором список элементов selectlistitems заполняется из базы данных.

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

Когда я устанавливаю точку останова перед возвратом представления, я вижу, что выбранный список заполняется так, как я ожидал. Таким образом, на данный момент все выглядит нормально. Режим просмотра полностью заполнен. Затем, на мой взгляд (я использую Razor), у меня есть следующие два правила, которые должны отображать для меня список избранных.

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

Когда я запускаю код и открываю представление для редактирования своего блога, я могу видеть все правильные данные. Также выбранный список отображается правильно, но элемент, который я хочу выбрать, потерял его. Как это может быть? До тех пор, пока точка зрения не вернется с видом, все в порядке. Но когда я просматриваю веб-страницу в браузере, selectlist присутствует только с правильным выбором. Что мне здесь не хватает? Или делать неправильно?

Ответ 1

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

Здесь вы неправильно используете вспомогательный метод. Первый аргумент должен быть свойством в вашей модели представления, которое будет содержать текущее выбранное значение. Это должно быть скалярное свойство, а не коллекция.

Итак, в вашей модели просмотра вам нужно добавить такое свойство:

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

И в действии вашего контроллера:

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

И, на ваш взгляд, просто:

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

Ответ 2

Я уверен, что раньше я использовал свойство selected = true элемента select list для хорошего эффекта. Одна из проблем, которые у меня были, - это противоречивое значение в ViewData.