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

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

Мне удалось отключить проверку на стороне клиента, предоставив моей кнопке submit 'Upload Image' значение класса "отмена стиля", поэтому

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

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

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

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

Я ищу средство для удаления ошибок модели. Возможно ли это?

EDIT:

Вот что я придумал:

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
}

Ответ 1

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

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

Ответ 2

Это строит предыдущие ответы, но упрощает его немного:

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

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

Он может свободно использоваться для очистки ошибок для нескольких полей.

Ответ 5

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

ModelState.Remove("{key}");