Подтвердить что ты не робот

ASP.NET MVC ValidateInput (false) перестает работать с xVal и [RegularExpression] DataAnnotation

Я хотел бы перехватить "<" символа в поле формы с помощью валидатора регулярных выражений. Я опишу проблему в 3 этапа:

Шаг 1. Когда я пытаюсь отправить форму с полем, содержащим "<" Я получаю "потенциально опасный запрос..." - как и ожидалось в ASP.NET.

Шаг 2. Чтобы избежать ASP.NET RequestValidation, я украшаю свой метод Update в контроллере "[ValidateInput (false)]".

Он работает как ожидалось - теперь я могу опубликовать сообщение "<" символ без ошибок.

Шаг 3. Я использую xVal с DataAnnotations. Например, [Требуется] или [StringLength (255)] работает должным образом.

НО, когда я использую: [RegularExpression ( "^ [^ < > ] * $", ErrorMessage = "Специальные символы не разрешены." )], Я снова получаю ошибку "Потенциально опасный запрос..." , несмотря на директиву [ValidateInput (false)].

Что происходит? Есть ли более простой способ для regex validaton, но с [ValidateInput (false)] на месте? Конечно, я хотел бы иметь код проверки в модели, а не в контроллере.

4b9b3361

Ответ 1

Нет, это была проблема в MVC 1 + xVal. В MVC 2 валидация работает как (и нет необходимости в xVal больше) - Alex42

Похоже, бот продолжает толкать его наверх. Не могли бы вы пометить ответ как принятый, чтобы он знал?

Ответ 2

Я использую xVal и nhibernate.validator, и я попытался воспроизвести это поведение, но поскольку валидатор привязан к стороне клиента, я не смог получить значение прошлой проверки на стороне клиента. когда я отключил javascript, он получил проверку на стороне сервера и был пойман с помощью проверки правильности выражения.

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

должно произойти что-то еще, вызывающее ошибку. Извините, я не могу быть более полезным!

Ответ 3

Попробуйте выполнить проверку с помощью простого правила с помощью этого метода. Это может по крайней мере исключить xVal из уравнения. Если проблема сохранится, я бы предположил, что она связана с:

  • реализация MVC default Binder
  • или существует проблема с механизмом просмотра MVC в выпуске, использующем это, чтобы каким-то образом разрешить исключение для атрибута, указанного вами, путем проверки <, когда он не будет

Ответ 4

Если это просто поле, вы можете просто написать программу для поиска символа '< или > 'и удалите его. вы можете достичь этого, используя подстроку. надеюсь, что это поможет

  • use Для цикла для длины текста, подлежащего тестированию (для (int я = 1, я <= text.length, ++))
  • проверить каждый символ, начинающийся 1 (например, ch = text.substring(i, 1)
  • добавить каждый прочитанный символ в строку tmp, кроме '< или > '

Ответ 5

Я предполагаю, что статический метод Escape() разрешит это для вас.

  Regex r = new Regex(Regex.Escape(expression));

Ответ 6

Поместите эту строку в web.config

<httpRuntime requestValidationMode="2.0" />

Это изменение в ASPNET 4.0