Почему ValidateInput (False) не работает?

Я конвертирую приложение, которое я создал с помощью webforms в инфраструктуру asp.net mvc, используя vb.net. У меня проблема с одним из моих взглядов. Я получаю желтый экран смерти, говорящий: "Потенциально опасное значение Request.Form было обнаружено у клиента", когда я отправляю свою форму. Я использую tinymce как мой RTE. Я сам установил

ValidateRequest = "ложь"

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

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _

... и...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _

... и тому подобное...

<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _

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

Ответ 1

Вы уверены, что действие контроллера, которое вы отправляете, является тем, на котором у вас есть атрибуты?

Ответ 2

С помощью asp.net 4 вам также нужно настроить режим проверки в файле web.config.

Задайте в качестве дочернего элемента <system.web> следующее:

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>     

Asp.Net 4 по умолчанию задает requestValidationMode 4.0, который сообщает системе выполнить проверку запроса до этапа BeginRequst HTTP-запроса. Проверка будет происходить до того, как система достигнет атрибута действия, в котором говорится, что он не проверяет запрос, тем самым делая атрибут бесполезным. Установка requestValidationMode = "2.0" вернется к проверке поведения запроса asp.net 2.0, позволяя атрибуту ValidateInput работать как ожидалось.

Ответ 3

Когда вы используете свои собственные привязки модели, которые реализуют интерфейс IModelBinder, вы заметите, что эти пользовательские привязки моделей всегда проверяют данные независимо от любых атрибутов. Вы можете добавить несколько строк кода, чтобы привязки пользовательских моделей соответствовали фильтру ValidateInput действий:

        // First check if request validation is required
        var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

        // Get value
        var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
        if (valueProviderResult != null)
        {
            var theValue = valueProviderResult.AttemptedValue;

            // etc...
        }

Это очень хорошо объясняется Martijn Boland здесь: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

Ответ 4

Вы можете попробовать получить доступ к полю, например HttpContext.Request.Unvalidated.Form [ "FieldName" ]

Ответ 5

Обратите внимание, что эти рекомендации не будут устранять проблемы, вызванные ошибкой, возникающей, когда вы должны использовать [ValidateInput (false)] в сочетании с FormCollection.

Смотрите: ASP.NET MVC 3 ValidateRequest (false) не работает с FormCollection

Ответ 6

Добавьте следующую строку кода:

GlobalFilters.Filters.Add(new ValidateInputAttribute(false));

для метода Application_Start().

Ответ 7

Если вы используете модель ввода и используете AllowHtml для требуемого свойства, вы будете разблокированы.

public class InputModel
{
    [AllowHtml]
    public string HtmlInput { get; set; }
}

...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}