如果ModelState为Invalid,则在mvc帖子之间持久化dropdownlist



我有一个简单的表单,它保存以下实体

public class TravelInfo{
  public int ID {get;set;}
  public string CentreCode {get;set;}
  public DateTime TravelDate {get;set;}
}

我在我的控制器中有标准的2个创建方法-1个得到1个帖子,并使用这个视图模型将内容放入视图中。

public class TravelInfoVM{
  public TravelInfo TravelInfo{get;set;}
  public IEnumerable<SelectListItem> Centres {get;set;}
}

控制器方法。。。

public ActionResult Create(){
  var CentresList = db.Centres.Select(c=> new SelectListItem {Text = c.Name, Value = c.Code}).ToList();
  TravelInfoVM = new TravelInfoVM(){Centres = CentresList};
  return View(TravelInfoVM);
}
[HttpPost]
public ActionResult Create(TravelInfoVM model){
  //the Centres part of the model at this point is empty
  if(ModelState.IsValid){
    //save
    //redirect
  }
  //do i **REALLY** have to get it again as below, or can I hold on to it somehow?
  model.Centres = db.Centres.Select(c=> new SelectListItem {Text = c.Name, Value = c.Code}).ToList();
  return View(model);
}

问题是,如果ModelState返回为无效,我真的需要再次往返DB以获得中心列表吗?或者有更好/不同的方法在帖子中保持这个列表,直到用户正确输入保存所需的详细信息。。?还是我完全搞错了。。

如果不将其添加到会话中,这是对会话的不适当使用。否则,每个请求都是一个唯一的雪花,即使它看起来是一样的,因为您返回的是带有错误的同一表单。

我不会担心的。这只是一个查询,由于它是以前已经发出的同一个查询。它很可能(或者至少可以(被缓存,所以无论如何,它可能不会真正进入数据库。

不过,我建议您对查询进行抽象,这样您的GET和POST操作就可以简单地调用一个不会更改的函数,如果您需要更改创建选择列表的方式,只需在一个地方执行即可:

internal void PopulateCentreChoices(TravelInfoVM model)
{
    model.Centres = db.Centres.Select(c=> new SelectListItem {Text = c.Name, Value = c.Code}).ToList();
}
...
public ActionResult Create(){
  var model = new TravelInfoVM();
  PopulateCentreChoices(model);
  return View(model);
}
[HttpPost]
public ActionResult Create(TravelInfoVM model){
  if(ModelState.IsValid){
    //save
    //redirect
  }
  PopulateCentreChoices(model);
  return View(model);
}

相关内容

  • 没有找到相关文章

最新更新