#asp.net #asp.net-mvc #validation #asp.net-mvc-3
#asp.net #asp.net-mvc #проверка #asp.net-mvc-3
Вопрос:
У меня есть Create-View, подобный этому…
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary(null, new { @class = "validation" })
...
<input class="cancel" type="submit" value="OK" />
...
<input name="submit" type="submit" value="Save" />
}
… и соответствующее действие контроллера:
[HttpPost]
public ActionResult Create(string submit, MyViewModel myViewModel)
{
if (submit != null) // true, if "Save" button has been clicked
{
if (ModelState.IsValid)
{
// save model data
return RedirectToAction("Index");
}
}
else // if "OK" button has been clicked
{
// Disable somehow validation here so that
// no validation errors are displayed in ValidationSummary
}
// prepare some data in myViewModel ...
return View(myViewModel); // ... and display page again
}
Я обнаружил, что могу отключить проверку на стороне клиента, установив class="cancel"
на кнопке «OK». Это работает нормально.
Однако проверка на стороне сервера все еще происходит. Есть ли способ отключить это в действии контроллера (см. Блок else в действии Create выше)?
Спасибо за помощь!
Ответ №1:
Недавно у меня была похожая проблема. Я хотел исключить некоторые свойства из проверки и использовал следующий код:
ModelState.Remove("Propertyname");
Чтобы скрыть сообщения об ошибках, вы можете использовать
ModelState.Clear();
Но вопрос в том, почему вы отправляете значения, если вы их не используете? Не лучше ли использовать кнопку сброса для сброса значений в форме:
<input type="reset" value="Reset Form">
Ответ №2:
Итак, если в вашей строке отправки ничего нет, вы хотите, чтобы она игнорировала проверку, является ли состояние модели допустимым, и предположила, что это так.
Однако это все еще продолжается, и проверьте вашу проверку и отобразитесь на стороне клиента через сводку проверки.
Если вас действительно не волнуют ошибки в этом случае, попробуйте
ModelState.Clear()
и удалите из него все ошибки.
Комментарии:
1.
it still is going ahead and check your validation and showing up on the client side
Я не верю, что это так, поскольку OP сказал на своей кнопке OK, что у них есть класс cancel, который, как я предполагаю, ненавязчиво позволяет обойти проверку на стороне клиента.2. @Chris Marisic — Я полагаю, что проверка на стороне клиента отключена (иначе форма не работала бы на высшем уровне), но у него есть Html.ValidationSummary (), который принимает все ошибки со стороны сервера и помещает их на страницу. В конечном итоге это отображается на стороне клиента. Вот что я имел в виду, говоря, что это на стороне клиента.
Ответ №3:
Проверка на стороне сервера должна быть в вашем классе MyViewModel. Можете ли вы использовать другой класс, который не реализует проверку? Аннотации данных в ViewModel отвечают за настройку ModelState.Значение равно false.
Комментарии:
1. Это то же самое строго типизированное представление, поэтому я думаю, что не могу использовать другую ViewModel.
2. @Slauma это не весь случай. У вас есть индивидуальный вид, который использует модель X, которая, вероятно, имеет все ваши атрибуты проверки. Вы могли бы создать модель Y, в которую вы копируете и вставляете модель X, и удалить все атрибуты проверки. На этом этапе вам необходимо выполнить 2 отдельных действия отправки формы. Итак, создайте (X) и сохраните время (Y). В конце TempSave (Y) вы либо захотите перенаправить к исходному действию (если оно может загружать данные временного сохранения), либо вам нужно будет вернуть View (X), который вы можете легко превратить Y в X, используя фреймворки сопоставления, такие как ValueInjecter.
3. Затем вы могли бы привязать javascript к кнопке отправки, которая изменила бы назначение формы с временного сохранения на создание.
4. @Leons проверка МОЖЕТ быть в их классе модели, это не обязательно. Если вы используете пользовательскую фабрику проверки, вы можете разместить свой код проверки где угодно. Я использую замену FluentValidation для средства проверки MVC, поэтому у меня есть вся моя проверка в отдельных файлах набора правил.
5. @Chris Marisic: Понятно, спасибо за объяснение! Но это как-то похоже на раскалывание ореха кувалдой.
ModelState.Clear()
Опция, похоже, работает нормально. Фоном является «Сценарий с зависимыми выпадающими списками» без JS / Ajax (см. Мой комментарий к моему собственному ответу).
Ответ №4:
Итак, мне только что пришла в голову эта идея:
...
else // if "OK" button has been clicked
{
ModelState.Clear();
}
...
Действительно, я больше не получаю сообщений в ValidationSummary. Есть ли у этого какой-либо недостаток или нежелательный побочный эффект? По крайней мере, я не вижу проблемы на данный момент…
Комментарии:
1. Я просто написал, что вы должны попробовать это. Я не думаю, что у этого действительно будет какой-либо недостаток, если вы уверены, что не хотите отображать эти ошибки. Я не уверен, почему вы не хотите отображать ошибки, если они нажимают кнопку отправки и ничего не было введено.
2. @chobo2: Lol, да, теперь есть много ответов, предлагающих очистить ModelState, поэтому я уверен, что это не совсем неправильно. Существует разница между кнопками «OK» и «Сохранить». Только кнопка «Сохранить» выполняет запись в базу данных и, следовательно, нуждается в проверке. Кнопка «OK» не выполняет запись в базу данных. Он только извлекает некоторые дополнительные данные в ViewModel и повторно отображает представление. На данный момент мне не нужна проверка. Это своего рода логика зависимого выпадающего списка: выберите запись в первом выпадающем списке, нажмите «ОК», заполните второй выпадающий список в зависимости от выбора в первом выпадающем списке.
3. Ах, я думал, вы просто не хотели показывать проверку людям, которые нажали пустые формы. Я не вижу ничего плохого в его использовании, если вы уверены, что любые неверные данные каким-то образом не попадут куда-то еще (например, сохранить их вслепую в базе данных, чего вы, похоже, не делаете).