ASP.NET MVC Html.ValidationSummary(true) не отображает ошибки модели

У меня есть проблема с 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)%>
<% } %>

Ответ 1

Я считаю, что флаг ValidationSummary работает так, что он отображает только ModelErrors для string.empty в качестве ключа. В противном случае предполагается, что это ошибка свойства. Пользовательская ошибка, которую вы добавляете, имеет ключ 'error', поэтому она не будет отображаться при вызове ValidationSummary (true). Вам необходимо добавить свое собственное сообщение об ошибке с пустым ключом, например так:

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

Ответ 2

Это работает лучше, так как вы можете показать validationMessage для указанного ключа:

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

и отобразите его следующим образом:

    @Html.ValidationMessage("keyName")

Ответ 3

Я знаю, что это своего рода старый и отмечен как ответы с 147 голосами, но есть еще что-то, что нужно учитывать.

У вас могут быть все ошибки модели, имя свойства и строки. Как правило, ключи могут быть указаны в 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);

enter image description here

Ответ 4

Может быть, так:

[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" })

Использование этой строки может быть полезным

Ответ 6

В моем случае он не работал из-за возврата.

Вместо использования:

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

Я использовал:

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

Это модель, поэтому obvius должен ModelState.AddModelError("keyName","Message"); работать с моделью.

Этот ответ показывает, почему. Добавление проверки с помощью DataAnnotations

Ответ 7

Если почти все кажется правильным, еще одна вещь, на которую нужно обратить внимание - убедиться, что резюме проверки не скрыто явно с помощью некоторого переопределения CSS:

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

Это также может привести к тому, что @Html.ValidationSummary появится скрытым, так как сводка динамически отображается с классом validation-summary-valid.

Ответ 8

Вы можете попробовать,

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

Ответ 9

ДОБАВЛЯЙТЕ его в самой нижней части вашего вида:

@section Скрипты {     @Scripts.Render( "~/bundles/jqueryval" )}