【发布时间】:2014-03-14 13:32:02
【问题描述】:
我的 DropDownLists 有一些问题,因为当我发布信息并且我的模型无效时,它会返回“空”到页面,触发与 this question 完全相同的错误。
我已经使用了那里提出的解决方案,它解决了我的问题。无论如何,我想避免每次我的 ModelState 无效时都查询数据库,我采用了这种方法。我想知道它是否有效,或者现在是否有更好的方法,考虑到我现在使用的是 MVC 5 而不是 MVC2(这是来自 question 的 MVC 版本),也许他们添加了一些新的东西解决这个问题。
我所做的是在我的模型无效时使用 TempData 来保存信息。
public class ViewModel
{
[DisplayName("Project")]
public int ProjectID { get; set; }
public List<SelectListItem> Projects { get; set; }
//Other fields
}
现在我的 Create() 操作(填充项目)
[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 吗?我虽然 TempData 仅通过相同的 HTTP 请求存活,这意味着它应该在页面加载时消失,并且在回发时不可用。
-
是的,我在发帖之前就这样做了。它之所以有效,是因为我正在访问 ViewModel 来填充 DropDownList 而不是 TempData。这样,它只能在控制器上被访问。如果控制器中出现错误,我只需重新填充 TempData,使其再次访问屏幕并返回(因为它没有在那里读取)
标签: c# asp.net-mvc validation