MVC3 - Доступ к содержимому выпадающего списка в контроллере - PullRequest
2 голосов
/ 20 января 2011

Я новичок в MVC2 / 3, так что имейте это в виду.Кроме того, использование Ajax или jQuery НЕ является опцией.

У меня есть веб-страница, где пользователь должен выбрать элемент из выпадающего списка, а затем нажать кнопку «Фильтр».(Нажатие на эту кнопку просто вызовет действие POST по умолчанию в моем контроллере и вернет отфильтрованный список результатов.

У меня все работает, кроме одной проблемы, с которой я столкнулся. Когда действие Filter завершено и возвращает управление обратноНа мой взгляд, содержимое раскрывающегося списка потеряно (т. е. равно нулю). Результаты возвращаются без проблем, просто мой раскрывающийся список пуст - поэтому пользователь не может выбрать другой элемент из списка.

Я должен заново заполнить выпадающий список в действии «Фильтр» или есть более чистый способ сделать это?

Вот снимок моего кода:

Моя ViewModel

public class MyViewModel {
        [DisplayName("Store")]
        public IEnumerable<Store> StoreList { get; set; }

        public string SelectedStore { get; set; }
}

My View (Index.cshtml)

@using (Html.BeginForm()) {

    <h2>Search</h2>

    @Html.LabelFor(m => m.StoreList)
    @Html.DropDownListFor(m => m.SelectedStore, new SelectList(Model.StoreList, "StoreCode", "StoreCode"), "Select Store")

    <input type="submit" value="Filter" />
}

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

public class MyController : Controller
{
        public ActionResult Index() {

            MyViewModel vm = new MyViewModel();
            var storelist = new List<Store>();
            storelist.Add(new Store { StoreCode = "XX" });
            storelist.Add(new Store { StoreCode = "YY" });
            storelist.Add(new Store { StoreCode = "ZZ" });
            vm.StoreList = storelist;

            return View(vm);
        }

        [HttpPost]
        public ActionResult Index(MyViewModel model, string SelectedStore, FormCollection collection) {

            if (ModelState.IsValid) {
                /* this works, model state is valid */

                /* BUT, the contents of model.StoreList is null */
            } 

            return View( model);
        }
}

Ответы [ 3 ]

3 голосов
/ 20 января 2011

Да, вам необходимо повторно заполнить любые модели (включая ViewData), которые передаются в представление.Помните, что это система без сохранения состояния, ваш контроллер восстанавливается при каждом вызове и запускается эффективно с нуля.

Я бы сделал это так:

0 голосов
/ 02 апреля 2011

Снова заполните выпадающий список, так как mvc не имеет состояния просмотра.

[HttpPost] public ActionResult Index (модель MyViewModel, строка SelectedStore, коллекция FormCollection) {

     if (ModelState.IsValid) {
        /* this works, model state is valid */

        /* BUT, the contents of model.StoreList is null */
     } 
     model.StoreList = GetStoreList();
     return View( model);
 }
0 голосов
/ 20 января 2011

Краткий ответ - да, вам необходимо пополнить раскрывающийся список в действии Фильтр. ASP.NET MVC не является WebForms - нет ViewState для сохранения содержимого вашего списка.

...