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.