ASP.NET MVC Html.ValidationSummary (true) не отображает ошибки модели - PullRequest
184 голосов
/ 12 мая 2010

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

Ответы [ 8 ]

315 голосов
/ 12 мая 2010

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

ModelState.AddModelError(string.Empty, ex.Message);
62 голосов
/ 27 февраля 2013

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

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

и отобразите это так:

    @Html.ValidationMessage("keyName")
28 голосов
/ 14 ноября 2013

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

У вас могут быть все ошибки модели, свойство name и 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);

enter image description here

7 голосов
/ 12 октября 2014

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

[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>
1 голос
/ 31 декабря 2018
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

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

1 голос
/ 28 сентября 2014

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

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

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 голосов
/ 12 мая 2015

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

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

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

0 голосов
/ 06 апреля 2015

ДОБАВЬТЕ в нижнюю часть вашего вида:

@ секции Scripts { @ Scripts.Render ("~ / bundles / jqueryval")}

...