ModelState.AddModelError - Як я можу додати помилку, яка не стосується властивості?


189

Я перевіряю свою базу даних, Create(FooViewModel fvm){...}щоб побачити, чи існує fvm.prop1та fvm.prop2вже існує в цій комбінації; якщо так, я хочу додати помилку до modelstate, а потім повернути весь погляд. Я намагався:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

... але я не відображаю помилок у програмі Html.ValidationSummary, саме там я припускаю, що вони з'являться. У мене є підозра, що "Модель" не є правильним ключем, але я нічого не зміг знайти Google.


Відповіді:


330

Я врешті-решт натрапив на приклад використання, який я шукав - призначити помилку Моделі взагалі, а не одній із її властивостей, як зазвичай називаєте:

ModelState.AddModelError(string key, string errorMessage);

але використовуйте порожній рядок для ключа:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

Повідомлення про помилку відображатиметься <%: Html.ValidationSummary() %>як слід.


22
Цей випадок змушує задуматися: Чому не існує такого способу, як ModelState.AddError(errorMessage)або ModelState.AddGlobalError(errorMessage)..., було б зрозуміти інтуїтивно і простіше, як додати повідомлення про помилку, не пов’язане з властивостями будь-якої моделі.
— Рубенс Маріуццо,

@Rubens: Це правда, але ви можете легко додати такий метод методами розширення.
— Johnny5

2
Ви також можете відобразити помилку, скориставшись@Html.ValidationMessage(string.Empty)
— Ben Foster

Ключ є властивістю вашої моделі, прив’язаної до подання - у цьому є помилка - просто для зрозуміння.
— niico

1
ValidationSummaryErrors(bool excludePropertyErrors)Перевантаження буде відображати всі помилки перевірки , якщо її аргумент є хибним або тільки немайнові конкретним (ключ = «») помилки , якщо її аргумент вірно.
— Suncat2000

26

Ви можете додати помилку моделі в будь-яку властивість вашої моделі, я пропоную, якщо немає нічого, пов’язаного зі створенням нового ресурсу.

Як приклад, ми перевіряємо, чи електронна пошта вже використовується в БД, і додаємо помилку до властивості електронної пошти в дії, тому коли я повертаю представлення, вони знають, що є помилка, і як це показати, використовуючи

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

і

ModelState.AddModelError("Email", Resources.EmailInUse);

1
Це здається протиінтуїтивним у моєму випадку - я перевіряю, чи існує певна комбінація col1 та col2 у базі даних, тому, здається, не має права IsDuplicateOfAbodyRow у моєму ViewModel. Виявляється, ви можете додати помилку до своєї моделі - дивіться мою відповідь.
— Скотт Бейкер

1
Чи є спосіб отримати рядок "Електронна пошта" для AddModelError, не використовуючи крихкий буквальний рядок? Як (m=>m.email).SomeMagicToString()?
— Снексе

Я не думаю, що вам доведеться йти з магічною струною ... не найкраще, але все-таки хороше рішення
— VinnyG

4
nameofОператор приходить в C # 6.0 вирішує цю проблему магії проблема рядки. msdn.microsoft.com/en-us/magazine/dn802602.aspx
— RJ Cuthbertson

3

Встановлення властивості моделі крапки в рядки працювало для мене: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
Це дійсно показуватиме недійсний місяць у вашому інтерфейсі, але це не вирішує початкову проблему.
— Скотт Бейкер

2
Початкова проблема випливає з нерозуміння того, що "ключ" представляє у методі. Це проливає деяке світло на те, як функціонує "ключ", тому добре знати, що ключ не повинен бути лише іменем властивості, але також може стосуватися вкладених властивостей або спеціального значення String.Empty.
— Трайнко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.