在ModelState检查期间返回到View的ASP.NET Core更改模型

问题描述

在ModelState.IsValid检查期间,我需要更改模型的属性,然后返回到View。这是我的方法的样子:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SaveProject(MainProjectviewmodel model,string id = null)
        {
            if (string.IsNullOrEmpty(id))
            {
                if (!ModelState.IsValid)
                {    
                    bool validClientCheck = this.CheckIfClientNameAndIdAreValid(model.ProjectModel.ClientName,model.ProjectModel.ClientId);

                    if (!validClientCheck)
                    {
                        ModelState.AddModelError("ProjectModel.ClientId",$"Please select a valid client!");
                        model.ProjectModel.ClientId = null;
                    }

                    return View(model);
                }

                await this.projectService.SaveProject(model,"create");
            }
            return RedirectToAction("SaveProject","Project",new { id = model.ProjectModel.Id });
        }

即使我在视图中有model.ProjectModel.ClientId = null;,ClientId的隐藏字段仍然填充有客户端ID。在返回模型之前,如何更改模型?

解决方法

当您涉及使用ModelState进行验证时,View中的模型绑定并不简单。 对于帖子形式的特定字段,您可以使用键在变量ModelState中对其进行访问。如果要修改该字段的值,则应修改变量ModelState而不是页面model中的值。

根据您的情况,您可以添加以下代码:

// Add custom error before the model validation...
ModelState.AddModelError("ProjectModel.ClientId",$"Please select a valid client!");
if (!ModelState.IsValid)
{
     // Modify the value to empty
     ModelState["ProjectModel.ClientId"].RawValue = "";  //add this line after set model error
}
return View(model);