web-dev-qa-db-ja.com

コントローラasp.net mvc 5からのビューにエラーメッセージを表示する

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でエラーを表示する方法は?そして、どれが推奨/ベストプラクティスですか?

22
Unbreakable

しかし、ビューモデルに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)
36
CodeNotFound

しかし、ビューモデルに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の使用を厳密に型指定されたビューモデルに置き換えます。

3
Darin Dimitrov

私に関しては、受け入れられたアンサーはベストプラクティスではありません。注釈のすべてのエラーを処理できます。
ViewModelで、プロパティにErrorMessagesを指定します。

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)
1
Marek

誰かが簡単な修正と永続的なものを探しているなら、この答えを自由に使ってください。アプリケーション内のセキュリティについて心配する必要がある場合は、この修正を使用しないでください。

コントローラーで:

TempData["Message"] = "This is my Error";

Error.cshtmlファイルで:

<h3><strong>@TempData["Message"]</strong></h3>

結果:

enter image description here

0
Zach Pedigo