我有一个简单的表单,它保存以下实体
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);
}