当ModelState无效时,持久化下拉信息
本文关键字:信息 持久化 ModelState 无效 | 更新日期: 2023-09-27 17:50:12
我的下拉列表有一些问题,因为当我发布信息和我的模型无效时,它会返回"空"到页面,触发像这个问题一样的错误。
我使用了那里提出的解决方案,它解决了我的问题。无论如何,我希望避免在每次ModelState无效时查询数据库,因此采用了这种方法。我想知道它是否有效,或者现在是否有更好的方法来做到这一点,考虑到而不是MVC2(这是MVC版本的问题),我现在使用MVC 5,也许他们添加了一些新的东西来解决这个问题。
我所做的是当我的模型无效时使用TempData来持久化信息。
public class ViewModel
{
[DisplayName("Project")]
public int ProjectID { get; set; }
public List<SelectListItem> Projects { get; set; }
//Other fields
}
现在我的Create() Action(填充项目)
[HttpGet]
public ActionResult Create()
{
ViewModel vmodel = new ViewModel();
vmodel.Projects = db.GetProjects(User.Identity.Name).Select(x => new SelectListItem { Text = x.Description, Value = x.Id }).ToList();
TempData["Projects"] = vmodel.Projects;
return View(vmodel);
}
我的帖子是这样的:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ViewModel vmodel)
{
//Clear TempData (in theory will clear my tempdata when read, so if this controller redirects to another action my tempdata will be clear)
List<SelectListItem> projects = (TempData["Projects"] as List<SelectListItem>);
if (ModelState.IsValid)
{
//...
}
//If it got here it's going back to the screen.
//Repopulate the TempData (allowing it to exist one more trip)
TempData["Projects"] = projects;
vmodel.Projects = projects
return View(atendimento);
}
这个方法好吗?有没有更好的方法来实现这一点,而不需要每次都查询数据库?
非常感谢!
您根本不需要使用TempData
,因为您在视图模型中有一个属性来保存下拉项。
public ActionResult Create()
{
ViewModel vmodel = new ViewModel();
vmodel.Projects = GetProjects();
return View(vmodel);
}
private List<SelectListItem> GetProjects()
{
return db.GetProjects(User.Identity.Name)
.Select(x => new SelectListItem { Text = x.Description,
Value = x.Id }).ToList();
}
在视图
@Html.DropDownListFor(s=>s.ProjectID,Model.Projects)
在你的HttpPost动作,如果ModelState是无效的,重新加载Projects
集合(,因为http是无状态的)
if(ModelState.IsValid)
{
// to do :Save and redirect
}
model.Projects = GetProjects();
return View(model);
你可以缓存Projects
,这样你就不需要每次都访问数据库,如果你太担心性能
就我个人而言,我不担心每次都要为这种操作查询数据库。
如果项目被添加/删除怎么办?这可能是保存失败的原因(所选项目被删除),用户永远不会意识到这一点。
我通常写一个方法来填充我所有的视图模型的SelectListItem
s,然后在我的Get
和我的Post
中使用它,如果验证失败。