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)%>
<% } %>
ValidationSummaryフラグの機能は、string.empty
のModelErrorsのみをキーとして表示することだと思います。それ以外の場合は、プロパティエラーであると見なされます。追加するカスタムエラーにはキー 'error'があるため、ValidationSummary(true)を呼び出したときに表示されません。次のような空のキーを持つカスタムエラーメッセージを追加する必要があります。
ModelState.AddModelError(string.Empty, ex.Message);
指定したキーのvalidationMessageを表示できるため、これはより効果的です。
ModelState.AddModelError("keyName","Message");
次のように表示します。
@Html.ValidationMessage("keyName")
私はこれが一種の古いものであることを知っており、147の賛成票で回答としてマークされていますが、他に考慮すべきことがあります。
必要に応じて、ValidationSummaryにすべてのモデルエラー、名前付きプロパティ、string.Emptyキーを表示できます。これを行う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);
たぶんそう:
[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>
OR
<div class="alert alert-danger">
@Html.ValidationSummary(false)
</div>
@Html.ValidationSummary(false,"", new { @class = "text-danger" })
この行を使用すると役立つ場合があります
私の場合、返品のために機能していませんでした。
代わりに:
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による検証の追加
あなたが試すことができます、
<div asp-validation-summary="All" class="text-danger"></div>
ほとんどすべてが正しいように思える場合、注意すべきもう1つのことは、検証サマリーが次のようないくつかのCSSオーバーライドによって明示的に隠されないようにすることです:
.validation-summary-valid {
display: none;
}
これにより、@Html.ValidationSummary
クラスでサマリーが動的にレンダリングされるため、validation-summary-valid
が非表示になります。