C # MVC 3, используя список выбора с выбранным значением в представлении - PullRequest
23 голосов
/ 02 января 2011

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

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

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

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)

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

Ответы [ 2 ]

51 голосов
/ 02 января 2011
@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)
1 голос
/ 04 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...