Web開発の初心者で、ASP.Net MVC 5を学習しようとしています。レコードが見つからない場合、データベースで1つのレコードを探しています。ユーザーにエラーメッセージを表示します。以下は私の試みです:
コントローラー
[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つのプロパティを配置し、そのプロパティにエラーメッセージを設定する必要があることをどこかで読みました。私は今混乱しています、それを達成する方法とViewでエラーを表示する方法は?そして、どれが推奨/ベストプラクティスですか?
しかし、ビューモデルに1つのプロパティを配置し、そのプロパティにエラーメッセージを設定する必要があることをどこかで読みました。私は今混乱しています、それを達成する方法とViewでエラーを表示する方法は?そして、どれが推奨/ベストプラクティスですか?
ベストプラクティスは、コントローラーの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)
しかし、ビューモデルに1つのプロパティを配置し、そのプロパティにエラーメッセージを設定する必要があることをどこかで読みました。
そのとおりです。エラーメッセージをビューモデルに追加できます。
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
の使用を厳密に型指定されたビューモデルに置き換えます。
私に関しては、受け入れられたアンサーはベストプラクティスではありません。注釈のすべてのエラーを処理できます。
ViewModelで、プロパティにErrorMessage
sを指定します。
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)