POST后带有验证错误的ASP.NET Core不显示控件中的数据

时间:2019-05-13 16:03:41

标签: asp.net-core model-binding

注意:这是所有非常简化的代码,用于演示该问题。我的真实代码具有更多控件,客户端验证等。

在名为<form>的视图中,我有以下Jim.cshtml(非常简化)...

<form method="post" asp-controller="Home" asp-action="Jim">
  <div asp-validation-summary="All" class="text-danger"></div>
  <label for="Email">Email</label>
  <input type="text" id="Email" name="Email">
  <div>
    <button type="submit">Submit</button>
  </div>
</form>

以及相应的控制器代码...

public IActionResult Jim() =>
  View();

[HttpPost]
public IActionResult Jim(Jim j) {
  // Silly server-side validation for testing
  if (!j.Email.StartsWith("x")) {
    ModelState.AddModelError("Email","Must start with an 'x'");
  }
  if (!ModelState.IsValid) {
    return View(j);
  }
  return RedirectToAction(nameof(Index));
}

Jim视图模型如下所示……

public class Jim {
  [Required(ErrorMessage = "Required")]
  public string Email { get; set; } = "";
}

如果我加载页面,请输入不以“ j”开头的电子邮件,然后单击“提交”按钮,则ModelState无效,因此控制器返回带有{模型。验证摘要显示错误消息,但文本框为空。

我希望文本框使用我输入的电子邮件地址填充。

我在做什么错了?

谢谢

1 个答案:

答案 0 :(得分:1)

HTML本身不知道如何绑定到模型中的值。您必须明确地执行此操作,或使用asp-for之类的标签帮助程序。

使用asp-for

<input type="text" asp-for="Email">

或明确地:

<input type="text" name="Email" value="@Model.Email">