gpt4 book ai didi

c# - 当 ModelState 无效时保留下拉信息

转载 作者:行者123 更新时间:2023-12-02 15:32:55 26 4
gpt4 key购买 nike

我的 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,因为您在 View 模型中有一个属性来保存下拉项。

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();
}

在 View 中

@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,这样您就不必每次都访问数据库。

关于c# - 当 ModelState 无效时保留下拉信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22406452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com