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


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

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

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

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

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

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
}
4 66

4 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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

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