Почему ValidateInput (False) не работает? - PullRequest
33 голосов
/ 30 апреля 2009

Я конвертирую приложение, созданное с помощью веб-форм, в инфраструктуру 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)> _

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

Ответы [ 7 ]

130 голосов
/ 27 марта 2010

При использовании asp.net 4 вам также потребуется настроить режим проверки в файле web.config.

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

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

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

17 голосов
/ 30 апреля 2009

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

3 голосов
/ 23 января 2012

Когда вы используете свои собственные связующие модели, которые реализуют интерфейс 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...
}

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

1 голос
/ 13 июня 2016

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

1 голос
/ 08 декабря 2010

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

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

0 голосов
/ 29 января 2017

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

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

...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}
0 голосов
/ 18 декабря 2013

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

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

к методу Application_Start ().

...