Отображать сообщение об ошибке в представлении от контроллера asp.net mvc 5
Я новичок в веб-разработке и пытаюсь изучить ASP.Net MVC 5. Я ищу одну запись в базе данных, если запись не найдена, тогда я хочу отобразить сообщение об ошибке пользователю. Ниже приведена моя попытка:
контроллер
[HttpGet]
public ActionResult Search()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Search(ForgotPasswordMV viewModel)
{
if (Temp.Check(viewModel.Email))
return RedirectToAction("VerifyToken", new { query = viewModel.Email });
else
{
ViewBag.ErrorMessage = "Email not found or matched";
return View();
}
}
Вид:
<p>@ViewBag.ErrorMessage</p>
ViewModel
public class ForgotPasswordMV
{
[Display(Name = "Enter your email"), Required]
public string Email { get; set; }
}
Но я где-то читал, что должен поместить одно свойство в свою модель представления и установить сообщение об ошибке этого свойства. Теперь я запутался, как это сделать и как отобразить ошибку в представлении? И какой из рекомендуемых/лучших практик?
Ответы
Ответ 1
Но я где-то читал, что должен поместить одно свойство в мою модель и установите это сообщение об ошибке. Я сейчас смущен, как это и как отобразить ошибку в представлении? И какой рекомендуемая/лучшая практика?
Лучшей практикой является изменение свойства словаря ModelState
вашего контроллера следующим образом:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Search(ForgotPasswordMV viewModel)
{
// ...
else
{
ModelState.AddModelError("Email", "Email not found or matched");
return View(viewModel);
}
}
Затем в вашем представлении добавьте строку рядом с полем электронной почты;
@Html.ValidationMessageFor(m => m.Email)
Ответ 2
Но я где-то читал, что должен поместить одно свойство в мою модель представления и установить сообщение об ошибке в этом свойстве.
Это правильно. Вы можете добавить сообщение об ошибке в свою модель просмотра:
public class ForgotPasswordMV
{
[Display(Name = "Enter your email"), Required]
public string Email { get; set; }
public string ErrorMessage { get; set; }
}
а затем установите это свойство в вашей модели представления и передайте модель представления в представление:
...
else
{
viewModel.ErrorMessage = "Email not found or matched";
return View(viewModel);
}
и, наконец, в вашем строго типизированном представлении используйте свойство на вашей модели:
@model ForgotPasswordMV
...
<p>@Model.ErrorMessage</p>
Таким образом, в основном здесь мы заменяем использование ViewBag
на строго типизированную модель представления.
Ответ 3
Что касается меня, то принятый anwser - не лучшая практика. Мы можем обрабатывать все ошибки в аннотациях.
В нашей модели ViewModel мы указываем ErrorMessage
для наших целей.
public class UserLoginViewModel
{
[Required(ErrorMessage = "User name is required")]
[Display(Name = "User name")]
[StringLength(500, ErrorMessage = "User name is too short", MinimumLength = 3)]
public string Login { get; set; }
[Required(ErrorMessage = "Password is required")]
[Display(Name = "Password")]
public string Password { get; set; }
}
В нашем контроллере
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(UserLoginViewModel model)
{
if (!this.ModelState.IsValid)
{
return this.View();
}
...
}
И наш взгляд
@Html.ValidationMessageFor(model => model.Login)
@Html.EditorFor(model => model.Login)
@Html.ValidationMessageFor(model => model.Password)
@Html.EditorFor(model => model.Password)
Ответ 4
Если кто-то ищет простое исправление и НИЧЕГО ПОСТОЯННОГО, не стесняйтесь использовать этот ответ, поскольку это помогло мне. НЕ используйте это исправление, если вам нужно беспокоиться о безопасности своего приложения.
В вашем контроллере:
TempData["Message"] = "This is my Error";
В вашем файле Error.cshtml:
<h3><strong>@TempData["Message"]</strong></h3>
Результат:
![enter image description here]()