asp.net mvc 3 Проблемы с Dropdownlist, должны иметь тип 'IEnumerable <SelectListItem>'? - PullRequest
3 голосов
/ 18 сентября 2011

При нажатии кнопки сохранить у меня появляется следующая ошибка:

элемент ViewData, имеющий ключ 'SelectedCategoryId', имеет тип 'System.Int32', но должен иметь тип 'IEnumerable'?

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

public ActionResult IndexTwee()
    {

        var listCategories = new List<SelectListItem>();

        listCategories.Add(new SelectListItem() {Text="foo",Value="1" });
        listCategories.Add(new SelectListItem() { Text = "bar", Value = "2" });

        MyViewModelTwee model = new MyViewModelTwee() { };

        model.Categories = listCategories;
        model.SelectedCategoryId = 2;

        return View(model);
    }


    [HttpPost]
    public ActionResult IndexTwee(MyViewModelTwee Model)
    {

        return View(Model);

    }

моя модель:

  public class MyViewModelTwee
{
    public int SelectedCategoryId { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; }
}

мой взгляд:

@model mvc3DropDown.Models.MyViewModelTwee
@using (Html.BeginForm())
{
    @Html.DropDownListFor(
    x => x.SelectedCategoryId,
    Model.Categories
)
    <button>Save</button>

}

1 Ответ

2 голосов
/ 18 сентября 2011

Не забудьте перепривязать список в действии POST:

[HttpPost]
public ActionResult Index(MyViewModelTwee Model)
{
    var listCategories = new List<SelectListItem>();
    listCategories.Add(new SelectListItem() { Text = "foo", Value = "1" });
    listCategories.Add(new SelectListItem() { Text = "bar", Value = "2" });
    Model.Categories = listCategories;
    return View(Model);
}

Помните, что при отправке html <form> отправляется только выбранное значение.Остальные значения теряются, поэтому вам нужно перезапускать их с того места, где вы их взяли в действии GET.Конечно, вы извлечете этот код в слой хранилища, чтобы ваш код теперь выглядел следующим образом:

public ActionResult IndexTwee()
{
    var model = new MyViewModelTwee
    {
        SelectedCategoryId = 2,
        Categories = _repository.GetCategories()
    };
    return View(model);
}

[HttpPost]
public ActionResult IndexTwee(MyViewModelTwee Model)
{
    Model.Categories = _repository.GetCategories();
    return View(Model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...