ASP.NET Core не показывает данные в элементах управления после POST с ошибками проверки - PullRequest
0 голосов
/ 13 мая 2019

Примечание: Это очень упрощенный код для демонстрации проблемы.В моем реальном коде гораздо больше элементов управления, проверка на стороне клиента и т. Д.

У меня есть следующее <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 недействителен, поэтому контроллер возвращает представление Jim с моделью.Сводка проверки показывает сообщение об ошибке, но текстовое поле пустое.

Я ожидал, что текстовое поле будет заполнено введенным мною адресом электронной почты.

Что я делаю не так?

Спасибо

1 Ответ

1 голос
/ 13 мая 2019

HTML сам по себе не знает, как связываться со значениями в вашей модели. Вы должны либо сделать это явно, либо использовать помощник по тегам, такой как asp-for.

Использование asp-for:

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

Или явно:

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