MVC3 Удалить ModelState Ошибки - PullRequest
       8

MVC3 Удалить ModelState Ошибки

75 голосов
/ 15 сентября 2011

У меня есть ситуация, когда я загружаю изображение, выбранное пользователем из его локальной файловой системы.Моя форма, на мой взгляд, в основном имеет две кнопки отправки.Один из них используется для отправки формы в обычном режиме, и все проверки выполняются.Второе предназначено только для загрузки изображения, в этом случае я пока не хочу проверять.

Мне удалось отключить проверку на стороне клиента, дав моей кнопке отправки «Загрузить изображение» значение класса «style-name cancel», поэтому

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

Теперь, когда я публикую сообщениеназад, моя модель имеет свойство UploadImageButton, при нажатии этой кнопки оно заполняет это свойство (имя входа соответствует свойству).Таким образом, я знаю, была ли форма отправлена ​​моей настоящей кнопкой «Отправить» или кнопкой UploadImageButton.

У меня такой вопрос ... Как отключить проверку на стороне сервера?Я не хочу, чтобы информация о проверке появлялась, когда пользователь нажимает эту кнопку.Я знаю, что вы можете добавить пользовательские ошибки модели, используя это

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
}

Ответы [ 5 ]

132 голосов
/ 15 сентября 2011

Вы можете удалить ошибки модели, выполнив что-то вроде этого:

if (ModelState.ContainsKey("{key}"))
    ModelState["{key}"].Errors.Clear();
61 голосов
/ 15 апреля 2012

Это строит из предыдущих ответов, но упрощает это немного больше:

foreach (var modelValue in ModelState.Values)
{
    modelValue.Errors.Clear();
}
6 голосов
/ 02 июня 2014

Я иногда использую его, поэтому я сделал из него метод расширения:

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

Может использоваться для сброса ошибок в нескольких полях.

6 голосов
/ 05 июня 2013

Как правило, вы не хотите отключать проверку на стороне сервера или удалять ошибки ModelState вручную.Это выполнимо, но подвержено ошибкам, поскольку должно полагаться на строки в качестве ключей.Я проголосовал за ответ о том, как убрать ключи, потому что он правильный и полезный, но я рекомендую не превращать себя в случай, когда вы должны строго его рассмотреть.

В вашем случае у вас есть несколько кнопок отправки длята же форма, но вы действительно не отправляете форму при загрузке изображения.Чтобы предотвратить проверку на стороне клиента, вы можете использовать класс «отмена», как вы уже указали, но я также рекомендую иметь 2-ю кнопку отправки в другой форме, и в этом случае она не вызывает проверки в основной форме.

Есть еще одно преимущество использования другой формы: вы можете отправить ее другому методу ActionResult, который бы просто обрабатывал логику загрузки изображения.Этот другой метод просто не потрудился бы проверить свойство IsValid состояния модели: он заботится только о том, есть ли на изображении информация, и это можно проверить отдельно.(Даже если вы используете тот же метод ActionResult, вы можете направить логику так, чтобы вы не полагались на свойство IsValid состояния модели.)

Если необходимо удалить ошибки из состояния модели, иимеет смысл очистить все из них, попробуйте это:

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

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

Последнее, что нужно проверить в этих случаях, - есть ли у вас значения, которые только иногда отображаются в представлении, что не приведет к проверке на стороне клиента (их нет в представлении), но приведет к результату.в вопросах проверки на стороне сервера.В этом случае лучше использовать @ Html.HiddenFor (model => model.PropertyName), если вы можете, предполагая, что значение уже установлено, оно просто не отображается в этом представлении.

0 голосов
/ 06 декабря 2018

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

ModelState.Remove("{key}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...