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