2013-05-08 2 views
1

У меня есть вид EDIT, строго типизированный для модели, которая имеет 2 поля: Название и категория. Название - это просто строка и категория выбрана из выпадающего списка.MVC4 DropDownListFor - показывает правильный результат

Мой контроллер:

[HttpGet] 
     public ActionResult EditAuthor(int id) 
     { 
      var db = new AuthorDatacontext(); 
      var Author = db.Authors.Find(id); 
      ViewBag.category = new SelectList(new[] { "ScienceFiction", "fantasy", "LoveStory", "History" }); 
      return View(Author); 
     } 

Мой Вид:

<div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.category) 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownListFor(model => model.category, (SelectList)ViewBag.category) 

      @Html.ValidationMessageFor(model => model.category) 
     </div> 

Сейчас выпадающий список просто показывает все варианты, которые я могу выбрать из, но не тот вариант, который уже выбрали. Как я могу показать сначала категорию, которая уже была показана?

+0

Вы уверены, что все, что находится в собственности 'Model.category' при загрузке страницы, находится в выпадающем списке? – mattytommo

+0

да, потому что это то, что я могу видеть на странице деталей, и я выбираю его из раскрывающегося списка в создании PAge –

ответ

1

Я думаю, это может быть связано с тем, что вы не устанавливаете свойство IsSelected. Попробуйте вместо этого:

Во-первых, давайте создадим модель представления, поэтому мы можем поставить ниспадающее меню там:

public class AuthorViewModel 
{ 
    public Author Author { get; set; } 
    public List<SelectListItem> Categories { get; set; } 
} 

Тогда в вашем методе контроллера, давайте заполнить модель:

[HttpGet] 
public ActionResult EditAuthor(int id) 
{ 
    var db = new AuthorDatacontext(); 
    var selections = new List<string> { "ScienceFiction", "fantasy", "LoveStory", "History" }; 
    var model = new AuthorViewModel(); 

    model.Author = db.Authors.Find(id); 
    model.Categories = selections 
    .Select(s => new SelectListItem 
       { 
        Text = s, 
        Value = s, 
        Selected = s == model.Author.Category 
       }) 
    .ToList(); 

    return View(model); 
} 

Тогда изменить вид тип модели:

@model AuthorViewModel 

Тогда вы можете сделать:

@Html.DropDownListFor(model => model.Author.Category, Model.Categories) 
+0

. Я не понял, где разместить этот код. var, который должен находиться в контроллере, но у него нет model.category (возможно, вы имеете в виду author.category). В любом случае проблема заключается в том, что выпадающее значение получило тип SelectList, а не тип List ... –

+0

@AlexandraOrlov Поместите этот код в свой контроллер, да, вы правы, я изменил его на 'author'. Проверьте мое редактирование, я добавил вам код бритвы для вашего просмотра. – mattytommo

+0

Проблема с строкой, которую вы написали в представлении, заключается в том, что ее нужно отличать определенным типом. И его нельзя отбросить (Список ) –

Смежные вопросы