ASP.NET MVC Html.ValidationSummary (вірно) не відображає помилки моделі


194

У мене є проблема з Html.ValidationSummary. Я не хочу відображати помилки властивостей у ValidationSummary. І коли я встановлюю Html.ValidationSummary (правда), він не відображає повідомлення про помилки від ModelState. Коли є деякий виняток у дії контролера на рядок

MembersManager.RegisterMember(member);

розділ лов додає помилку до 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 працює так, що він відображатиме лише ModelErrors string.emptyяк ключ. В іншому випадку передбачається, що це помилка властивості. Спеціальна помилка, яку ви додаєте, містить ключ "помилка", тому вона не відображатиметься під час виклику ValidationSummary (true). Вам потрібно додати власне повідомлення про помилку порожнім ключем, як це:

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

9
@LordCover: Я здогадуюсь, що це "працює як розроблено", а не помилка - перевантаження ValidationSummary (), що використовується за замовчуванням, виключає помилки ModelState, пов'язані з властивостями самої моделі. Це дозволяє залишати ці помилки представленими викликами Html.ValidationMessageFor () для кожного окремого властивості, не дублюючи їх у резюме. Зважаючи на це, здається, що будь-яка помилка моделі, додана з не порожнім ключем, вважається пов'язаною з властивістю моделі, навіть якщо ключ не відповідає імені властивості.
Даніель Шаффер

26
Лише примітка для інших реалізаторів: ModelState.AddModelError(string.Empty, ex);схоже, що це також не працює. Ви повинні використовувати ModelState.AddModelError(string, string)перевантаження, як показано вище.
wolfyuk

2
оновлення: у MVC4 це вже не здається. ModelState.AddModelError ("", ex.Message); твори
Ніл Томпсон

4
MVC5 Мені ще потрібно зателефонувати в ex.Message, щоб він працював.
smiggleworth

врятував день! MVC5 все ще має деякі проблеми :)
juFo

67

Це працює краще, оскільки ви можете показати валідацію повідомлення для вказаного ключа:

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

і відобразити його так:

    @Html.ValidationMessage("keyName")

28

Я знаю, що це щось старе і було позначено як відповіді 147 голосами "за", але є ще щось, що слід врахувати.

Ви можете мати всі помилки моделі, назва властивості і string.Порожні ключі однакові, відображатимуться у 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

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>

Примітка - це має бути <div>, якщо це <span>, воно не відображатиметься.
Стівен

-4

ДОБАВИТИ його в нижній частині та у вашому представленні:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.