我是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);
}
}
答案 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);
}