MVC3 - 访问Controller中下拉列表的内容

时间:2011-01-20 13:20:10

标签: asp.net-mvc-2 controller html.dropdownlistfor asp.net-mvc-3

我是MVC2 / 3的新手,所以请记住这一点。此外,使用Ajax或jQuery不是一种选择。

我有一个网页,用户必须从下拉列表中选择一个项目,然后点击“过滤”按钮。 (单击此按钮将在我的控制器中触发默认的POST操作,并返回已过滤的结果列表。

除了遇到一个问题外,我一切正常。当Filter操作完成并将控制返回到我的视图时,下拉列表内容将丢失(即,null)。结果返回没问题,只是我的下拉列表是空白的 - 从而阻止用户从列表中选择另一个项目。

我是否应该重新填充Filter操作的下拉列表,或者是否有更简洁的方法来执行此操作?

以下是我的代码的快照:

我的ViewModel

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

        public string SelectedStore { get; set; }
}

我的观点(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 个答案:

答案 0 :(得分:3)

是的,您必须重新填充传递给视图的任何模型(包括ViewData)。请记住,它是一个无状态系统,您的控制器会在每次调用时重新实例化,并从头开始有效启动。

我会这样做:

public class MyController : Controller
{
     private List<Store> GetStoreList()
     {
          List<Store> StoreList = new List<Store>();
          // ... Do work to populate store list
          return StoreList;
     }

     public ActionResult Index() {

         MyViewModel vm = new MyViewModel();
         vm.StoreList = GetStoreList();
         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 */
         } 
         model.StoreList = GetStoreList();
         return View( model);
     }
}

答案 1 :(得分:0)

简短回答是肯定的,您需要重新填充Filter操作中的下拉列表。 ASP.NET MVC不是WebForms - 没有ViewState来保存列表的内容。

答案 2 :(得分:0)

再次填充下拉列表,因为mvc没有View状态

[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 */
     } 
     model.StoreList = GetStoreList();
     return View( model);
 }