У меня есть ситуация, когда я загружаю изображение, которое пользователь выбрал из своей локальной файловой системы. Моя форма, на мой взгляд, в основном имеет две кнопки отправки. Один используется для обычной отправки формы, и все проверки выполняются. Второй предназначен только для загрузки изображения, и в этом случае я пока не хочу проверять.
Мне удалось отключить проверку на стороне клиента, дав моей кнопке отправки «Загрузить изображение» значение класса «отмена имени-стиля», поэтому
<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) return true.ModelState.ContainsKey(key)
иModelState.Contains(key)
делаете то же самое, но я хочу сказать, что все значения вModelState.Keys.ToList()
will по своей природе содержатся вModelState
, поэтому всеWhere
предложение является избыточным и снижает производительность. Хотя мелочь.Ответы:
Вы можете удалить ошибки модели, сделав что-то вроде этого:
if (ModelState.ContainsKey("{key}")) ModelState["{key}"].Errors.Clear();
источник
ModelState.IsValid
Это основано на предыдущих ответах, но немного упрощает их:
foreach (var modelValue in ModelState.Values) { modelValue.Errors.Clear(); }
источник
В общем, вы не хотите отключать проверку на стороне сервера или удалять ошибки ModelState вручную. Это выполнимо, но чревато ошибками, поскольку в качестве ключей должны использоваться строки. Я поддержал ответ о том, как удалить ключи, потому что он правильный и полезный, но я не рекомендую создавать себя в случае, когда вы должны серьезно это учитывать.
В вашем случае у вас есть несколько кнопок отправки для одной и той же формы, но вы действительно не отправляете форму, когда загружаете изображение. Чтобы предотвратить проверку на стороне клиента, вы можете использовать класс «cancel», как вы уже указали, но я также рекомендую иметь вторую кнопку отправки в другой форме, и в этом случае она не вызывает проверки в вашей основной форме.
Есть второе преимущество использования другой формы: вы можете отправить ее другому методу ActionResult, который будет обрабатывать логику загрузки изображения. Этот другой метод просто не потрудился бы проверить свойство IsValid состояния модели: он заботится только о том, есть ли информация в изображении, и это можно проверить отдельно. (Даже если вы используете тот же метод ActionResult, вы можете направить логику так, чтобы не полагаться на свойство IsValid состояния модели.)
Если вам необходимо удалить ошибки из состояния модели, и есть смысл очистить их все, попробуйте следующее:
foreach (var key in ModelState.Keys) { ModelState[key].Errors.Clear(); }
Это избавляет вас от зависимости от правильности названий ключей, но сохраняет значения, если какие-либо значения (действительные или недопустимые) уже существуют в модели.
Последнее, что нужно проверить в этих случаях, - это то, есть ли у вас значения, которые только иногда присутствуют в представлении, что не вызовет проверки на стороне клиента (их нет в представлении), но действительно приведет к проблемам проверки на стороне сервера. В этом случае лучше всего использовать @ Html.HiddenFor (model => model.PropertyName, если вы можете, предполагая, что значение уже установлено, оно просто не отображается в этом представлении.
источник
Я иногда его использую, поэтому сделал из него метод расширения:
public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName) { if (m.ContainsKey(fieldName)) m[fieldName].Errors.Clear(); return m; }
Его можно использовать для удаления ошибок в нескольких полях.
источник
используйте ModelState.Remove ("{key}"), чтобы удалить ошибку из модели, что приведет к сбросу ModelState.IsValid в значение true
ModelState.Remove("{key}");
источник