Для чого ModelState.IsValid діє в ASP.NET MVC в NerdDinner?


148

На прикладі NerdDinner Professional ASP.NET MVC 1.0 є спосіб створити новий обід як скопійований нижче (стор. 89 безкоштовної версії NerdDinner).

Там він перевіряє ModelState.IsValid на істинність. Здається, перевіряє, чи модель дійсна для бази даних (тобто вона фіксує перетворення типів даних, як дати з недійсним форматом, але не ділові правила). Це правда?

При надсиланні форми, якщо у вас є помилка в даті, ModelState.IsValid буде помилковим, і ви отримаєте помилку, але лише для дати, оскільки AddRuleViolations ніколи не виконувався. Якщо ви видалите чек на ModelState.IsValid повністю, ви отримаєте всі помилки (через виняток), включаючи маркування в даті, коли він недійсний. Тоді чому взагалі перевірка на ModelState.IsValid? Я щось пропускаю?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

Відповіді:


143

ModelState.IsValidповідомляє вам, чи були додані якісь помилки моделі ModelState.

Типова палітурка моделі додасть деякі помилки для основних питань перетворення типів (наприклад, передача не числа для чогось, що є "int"). Ви можете заповнити ModelState більш повно на основі будь-якої системи перевірки, яку ви використовуєте.

Зразок DataAnnotationsпалітурки зразка заповнить стан моделі помилками перевірки, взятими з DataAnnotationsатрибутів вашої моделі.


Бред є яким-небудь способом з'ясувати, чи є модель, прикрашена данимиАнотації "IsValid" без ModelState. (Скажімо, наприклад, що об'єкт завантажується з файлу або використовується в додатку консолі тощо)
runxc1 Bret Ferrier

1
Ні, ModelState.IsValid - єдиний спосіб дізнатися, чи були помилки перевірки (або перетворення даних) під час прив’язки моделі.
Бред Вілсон

@Brad, коли ви говорите "Ви можете заселити ModelState більш повно на основі будь-якої системи перевірки, яку ви використовуєте", як це досягнуто? Чи є спосіб зламати мій код перевірки ModelState для мого ViewModel? Я використовую EF4, тому більшість моїх перевірок є автоматичними поза коробкою.
WEFX

13
Використовуйте: var errors = ModelState.Values.SelectMany(v => v.Errors);з перервою для перегляду будь-яких проблем з підтвердженням.
full_prog_full

Іноді це помилка у пов’язаній таблиці, якщо імена властивостей були змінені, міграції не виконані, і в результаті SaveChanges (); виходить з ладу і не може статися через зміну.
Oracular Man

25

Від Errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Має бути:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Довідка: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html


5
Станом на 2015 рік AddModelErrorsметоду не існує.
Феліпе Кореа

6
Станом на 2016 рік, ModelState.AddModelErrors()метод існує
Іван

7
Станом на 2017 рік ModelState.AddModelErrorіснує метод , що не множині .
Захафер

0

Так, Джаред і Келлі Орр мають рацію. Я використовую такий код, як у винятку редагування.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

замість

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

Усі модельні поля, які мають певні типи, повинні бути перевірені, коли повернеться до контролера. Якщо будь-яке з модельних полів не відповідає визначеному типу, тоді ModelState.IsValid поверне помилкове значення. Тому що ці помилки будуть додані в ModelState.

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