ASP.NET MVC Html.ValidationSummary(true)がモデルエラーを表示しない


194

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

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)%>
<% } %>

回答:


324

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

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

9
@LordCover:これはバグではなく「設計どおりに機能している」と思います。デフォルトで使用されるValidationSummary()のオーバーロードは、モデル自体のプロパティに関連するModelStateエラーを除外します。これにより、これらのエラーは、要約で重複することなく、個々のプロパティのHtml.ValidationMessageFor()呼び出しによって表されます。これは、キーがプロパティの名前と一致していなくても、空でないキーで追加されたモデルエラーはモデルプロパティに関連付けられていると見なされることを念頭に置いてください。
ダニエルシャファー2011

26
他の実装者へのメモ:ModelState.AddModelError(string.Empty, ex);どちらも動作しないようです。ModelState.AddModelError(string, string)上記のようにオーバーロードを使用する必要があります。
wolfyuk

2
更新:MVC4では、これは当てはまらないようです。ModelState.AddModelError( ""、ex.Message); 作品
Neil Thompson

4
MVC5 ex.Messageを呼び出して機能させる必要がありました。
smiggleworth 2014年

日を救った!MVC5にはまだいくつかの問題があります:)
juFo 2018

67

指定されたキーのvalidationMessageを表示できるため、これはより適切に機能します。

    ModelState.AddModelError("keyName","Message");

次のように表示します。

    @Html.ValidationMessage("keyName")

28

私はこれが古いもので、147票の回答でマークされていることを知っていますが、他に考慮すべき点があります。

必要に応じて、すべてのモデルエラー、namedプロパティ、string.EmptyキーなどをValidationSummaryに表示できます。これを行うValidationSummaryにオーバーロードがあります。

    //   excludePropertyErrors:
    //   true to have the summary display model-level errors only, or false to have
    //   the summary display all errors.
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);

ここに画像の説明を入力してください


5
はい!次のように変更@Html.ValidationSummary(true, "", new { @class = "text-danger" })します@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem 2016年

7

多分そのようです:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
       if (!ModelState.IsValid)
       {
          ModelState.AddModelError("keyName", "Form is not valid");
          return View();
       }
       MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
       ModelState.AddModelError("keyName", ex.Message);
       return View(member);
    }
}

そしてディスプレイに追加:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

または

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

この行を使用すると役立つ場合があります


上記の行をcshtmlファイルに追加します。
sachind

2

私の場合、返品が原因で機能していませんでした。

代わりに:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });

私が使用した:

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });

それはモデルなので、 ModelState.AddModelError("keyName","Message");必要。

この答えはその理由を示しています。 DataAnnotationsによる検証の追加


0

ほぼすべてが正しいように見える場合は、次のように、CSSオーバーライドによって検証の概要が明示的に非表示にされていないことを確認する必要があります。

.validation-summary-valid {
    display: none;
}

これにより、@Html.ValidationSummary概要がvalidation-summary-validクラスで動的にレンダリングされるため、が非表示になる場合もあります。


0

あなたが試すことができます、

<div asp-validation-summary="All" class="text-danger"></div>

注-レンダリングされない<span>の場合、これは<div>である必要があります。
Stephen Angell

-4

ビューの最下部に追加します。

@sectionスクリプト{@ Scripts.Render( "〜/ bundles / jqueryval")}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.