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

这个方法好吗?有没有更好的方法来实现这一点,而不需要每次都查询数据库?

非常感谢!

当ModelState无效时,持久化下拉信息

您根本不需要使用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中使用它,如果验证失败。