198

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

10 に答える 10

333

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

ModelState.AddModelError(string.Empty, ex.Message);
于 2010-05-12T13:26:53.213 に答える
69

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

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

次のように表示します。

    @Html.ValidationMessage("keyName")
于 2013-02-27T11:55:01.763 に答える
28

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

必要に応じて、すべてのモデルエラー、名前付きプロパティ、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);

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

于 2013-11-13T22:50:15.397 に答える
9

多分そのように:

[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>
于 2014-10-12T14:04:04.217 に答える
6
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

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

于 2018-12-31T04:43:49.187 に答える
3

私の場合、返品のために機能していませんでした。

使用する代わりに:

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による検証の追加

于 2014-09-27T23:43:44.810 に答える
0

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

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

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

于 2015-05-12T20:37:03.370 に答える
0

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

<div asp-validation-summary="All" class="text-danger"></div>
于 2019-08-30T19:34:56.070 に答える
0

使用は以下の行を使用できます

    @if (!ViewData.ModelState.IsValid)
                {
                    @Html.ValidationSummary("", new { @class = "alert alert-warning alert-dismissible fade show" })
                }

各フィールドには、次のようなものを使用します。

                    @Html.ValidationMessageFor(m => m.Email, null, new { @class = "field-validation-error " })
于 2021-12-10T09:13:22.247 に答える
-5

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

@section Scripts {@ Scripts.Render( "〜/ bundles / jqueryval")}

于 2015-04-06T10:43:43.050 に答える