1. ホーム
  2. asp.net-mvc

[解決済み】ASP.NET MVC Html.ValidationSummary(true) でモデルエラーが表示されない。

2022-04-16 09:34:36

質問

Html.ValidationSummaryで問題があります。ValidationSummaryにプロパティ・エラーを表示したくありません。また、Html.ValidationSummary(true)を設定すると、ModelStateからのエラーメッセージが表示されません。文字列に対するコントローラアクションでExceptionが発生した場合

MembersManager.RegisterMember(member);

catchセクションは、ModelStateにエラーを追加します。

ModelState.AddModelError("error", ex.Message);

しかし、ValidationSummaryはこのエラーメッセージを表示しません。Html.ValidationSummary(false)を設定すると、すべてのメッセージが表示されますが、プロパティエラーは表示したくありません。どうしたらいいでしょうか?

以下は、私が使用しているコードです。

モデル

public class Member
{
        [Required(ErrorMessage = "*")]
        [DisplayName("Login:")]
        public string Login { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Password:")]
        public string Password { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password:")]
        public string ConfirmPassword { get; set; }
}

コントローラーです。

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
        if (!ModelState.IsValid)
            return View();

        MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("error", ex.Message);

        return View(member);
    }
}

表示します。

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
                        new { enctype = "multipart/form-data" })) {%> 
    <p>
        <%= Html.LabelFor(model => model.Login)%>
        <%= Html.TextBoxFor(model => model.Login)%>
        <%= Html.ValidationMessageFor(model => model.Login)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.Password)%>
        <%= Html.PasswordFor(model => model.Password)%>
        <%= Html.ValidationMessageFor(model => model.Password)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.ConfirmPassword)%>
        <%= Html.PasswordFor(model => model.ConfirmPassword)%>
        <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
    </p>

    <div>
        <input type="submit" value="Create" />
    </div>

    <%= Html.ValidationSummary(true)%>
<% } %>

解決方法は?

ValidationSummaryフラグが機能する方法は、ModelErrorsを表示するのは string.empty をキーにしています。それ以外の場合は、プロパティエラーと判断されます。追加したカスタムエラーはキーが'error'なので、ValidationSummary(true)を呼んでも表示されないでしょう。このように、空のキーを持つカスタムエラーメッセージを追加する必要があります。

ModelState.AddModelError(string.Empty, ex.Message);