Почему ValidateInput(False) не работает?
Я конвертирую приложение, созданное с помощью веб-форм, в инфраструктуру 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 ответов
Вы уверены, что действие контроллера, на которое вы отправляете сообщения, является тем, на котором у вас есть атрибуты?
В 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
атрибут для работы, как ожидалось.
Когда вы используете свои собственные связующие модели, которые реализуют интерфейс 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/
Вы можете попробовать получить доступ к полю, например, HttpContext.Request.Unvalidated.Form["FieldName"]
Добавьте следующую строку кода:
GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
к методу Application_Start().
Обратите внимание, что эти предложения не устранят проблемы, вызванные ошибкой, возникающей, когда вы должны использовать [ValidateInput(false)] в сочетании с FormCollection.
См.: ASP.NET MVC 3 ValidateRequest (false) не работает с FormCollection
Если вы используете модель ввода и AllowHtml для нужного свойства, вы будете разблокированы.
public class InputModel
{
[AllowHtml]
public string HtmlInput { get; set; }
}
...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}