MVC3 Видалення помилок ModelState


83

У мене ситуація, коли я завантажую зображення, яке користувач вибрав зі своєї локальної файлової системи. На мою думку, у моїй формі є дві кнопки подання. Один використовується для нормальної подачі форми, і всі перевірки виконуються. Другий призначений лише для завантаження зображення, і в цьому випадку я ще не хочу перевіряти.

Мені вдалося вимкнути перевірку на стороні клієнта, надавши моїй кнопці "Завантажити зображення" значення класу "скасувати назву-стилю", тому

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

Тепер, коли я відправляю повідомлення назад, моя модель має властивість UploadImageButton, коли натискається ця кнопка, вона заповнює цю властивість (назва введення відповідає властивості). Таким чином, я знаю, чи форму було надіслано моєю справжньою кнопкою «Надіслати» або кнопкою UploadImageButton.

Моє питання полягає в наступному ... Як я можу вимкнути перевірку ServerSide? Я не хочу, щоб інформація про Підсумок перевірки відображалася, коли користувач натискає цю кнопку. Я знаю, що ви можете додавати помилки власної моделі, використовуючи це

ModelState.AddModelError("{key}", "{error msg}");

Я шукаю засіб для усунення помилок моделі. Чи можливо це?

РЕДАГУВАТИ:

Ось що я придумав:

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
     //ModelState.Remove(key); //This was my solution before
     ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}

Чому ти робиш Where(key => ModelState.Keys.Contains(key))? Здається, речення Where надлишкове, оскільки кожен ключ у ModelState.Keys матиме свій ModelState.Keys.Contains (key) повернення true.
Максим Заславський

1
Я оновив запитання та текст, щоб використовувати коротший метод на ModelState.ContainsKey, хоча ви неправильно вважаєте. Вони роблять те саме.
Джефф Редді,

Вибачте, можливо, я погано пояснив або неправильно зрозумів вашу відповідь. Ви маєте рацію , що ModelState.ContainsKey(key)і ModelState.Contains(key)робити те ж саме, але моя точка є те , що всі значення ModelState.Keys.ToList()волі за своєю природою повинні міститися в ModelState, так що весь Whereпункт є зайвим і уповільнити роботу. Незначні речі.
Максим Заславський

Це був ReSharper, кидаючи це разом. Дякую, що вказали на це.
Джефф Редді,

1
Просто зауважте, як ви дізнаєтесь, яка кнопка була джерелом подання. У ViewModel ви не повинні мати цю властивість. Просто додайте параметр FormCollection до контролера: public IndexResult Index (модель YourViewModelClass, FormCollection formCollection). І перевірте, чи є в ньому назва кнопки: if (formCollection ["UploadImageButton"]! = Null). Я думаю, що краще, коли у вас буде більше кнопки подати.
jannagy02

Відповіді:


145

Ви можете видалити помилки моделі, виконавши щось подібне:

if (ModelState.ContainsKey("{key}"))
    ModelState["{key}"].Errors.Clear();

1
Це саме те, що я шукав. Я змінив обрану відповідь (вибачте, Адам Туліпер).
Джефф Редді,

Дякую, це щойно врятувало мою пару годин!
Agent007

1
Про всяк випадок, коли хтось замислювався, це теж впливаєModelState.IsValid
Red Taz

2
дивно, але в моєму випадку цього було недостатньо. Мені довелося додати ModelState ["{ключ}"]. ValidationState = ModelValidationState.Valid;
AGuyCalledGerald

67

Це будує попередні відповіді, але трохи спрощує їх:

foreach (var modelValue in ModelState.Values)
{
    modelValue.Errors.Clear();
}

7

Загалом, ви не хочете вимикати перевірку на стороні сервера або видаляти помилки ModelState вручну. Це можливо, але схильне до помилок, оскільки воно повинно покладатися на рядки як ключі. Я підтримав відповідь про те, як видалити клавіші, тому що він правильний і корисний, але я рекомендую не задумуватися над справою, коли ви повинні це суттєво розглянути.

У вашому випадку у вас є кілька кнопок надсилання для однієї форми, але ви дійсно не надсилаєте форму під час завантаження зображення. Щоб запобігти валідації на стороні клієнта, ви можете використовувати клас «скасувати», як ви вже вказали, але я також рекомендую мати другу кнопку подання в іншій формі, і в цьому випадку це не спричинить перевірки на вашій основній формі.

Є друга перевага використання іншої форми: ви можете надіслати її іншому методу ActionResult, який просто обробляє логіку завантаження зображення. Цей інший метод просто не заважав би перевірити властивість "IsValid" стану моделі: його цікавить лише наявність інформації на зображенні, і це можна перевірити окремо. (Навіть якщо ви використовуєте той самий метод ActionResult, ви можете спрямувати логіку, щоб не покладатися на властивість IsValid стану моделі.)

Якщо вам потрібно очистити помилки із стану моделі, і має сенс очистити їх усі, спробуйте наступне:

foreach (var key in ModelState.Keys)
{
    ModelState[key].Errors.Clear();
}

Це заважає вам залежати від правильності імен ключів, але зберігає значення, якщо в моделі вже існують будь-які значення (дійсні чи недійсні).

Останнє, що слід перевірити у цих випадках, - чи є у вас значення, які лише іноді перебувають у поданні, що не спричинить перевірки на стороні клієнта (їх немає у поданні), але призведе до проблем із перевіркою на стороні сервера. У цьому випадку найкраще використовувати @ Html.HiddenFor (model => model.PropertyName, якщо ви можете, припускаючи, що значення вже встановлено, воно просто не видно в цьому поданні.


7

Я використовую його іноді, тому я зробив із нього метод розширення:

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName)
{
    if (m.ContainsKey(fieldName))
        m[fieldName].Errors.Clear();
    return m;
}

Його можна вільно використовувати для усунення помилок для декількох полів.


3

використовуйте ModelState.Remove ("{key}"), щоб видалити помилку з моделі, яка скине ModelState.IsValid до true

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