ASP.NET 在 ModelState 检查期间核心更改模型并 return 查看
ASP.NET Core change model during ModelState check and return to View
在ModelState.IsValid检查的时候,我需要换一个属性的model然后return去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。如何在 return 将其添加到视图之前更改模型?
当涉及 ModelState
的验证时,View 中的模型绑定并不简单。
对于 post 形式的特定字段,您可以在变量 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);
在ModelState.IsValid检查的时候,我需要换一个属性的model然后return去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。如何在 return 将其添加到视图之前更改模型?
当涉及 ModelState
的验证时,View 中的模型绑定并不简单。
对于 post 形式的特定字段,您可以在变量 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);