У вас есть несколько вариантов.
В модели добавьте этот атрибут к каждому свойству, которое необходимо для разрешения HTML - лучший выбор.
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
В действии контроллера добавьте этот атрибут, чтобы разрешить весь HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Брутфорс в web.config - не рекомендуется
В файле web.config внутри тегов вставьте элемент httpRuntime с атрибутом requestValidationMode = "2.0". Также добавьте атрибут validateRequest = "false" в элемент страниц.
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Дополнительная информация: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Вышеупомянутое работает для использования привязки моделей по умолчанию.
Пользовательский ModelBinder
Похоже, что вызов bindingContext.ValueProvider.GetValue () в приведенном выше коде всегда проверяет данные независимо от каких-либо атрибутов. Изучение источников ASP.NET MVC показывает, что DefaultModelBinder сначала проверяет, требуется ли проверка запроса, а затем вызывает метод bindingContext.UnvalidatedValueProvider.GetValue () с параметром, который указывает, требуется ли проверка или нет.
К сожалению, мы не можем использовать какой-либо код фреймворка, потому что он запечатанный, закрытый или что-то еще, чтобы защитить невежественных разработчиков от выполнения опасных вещей, но не так уж сложно создать рабочий пользовательский связыватель модели, который уважает атрибуты AllowHtml и ValidateInput:
public class MyModelBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
var theValue = valueProviderResult.AttemptedValue;
}
}
}
Другая необходимая часть - это способ получить непроверенное значение. В этом примере мы используем метод расширения для класса ModelBindingContext:
public static class ExtensionHelpers
{
public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation)
{
var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
return (unvalidatedValueProvider != null)
? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation)
: bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
}
}
Подробнее об этом на http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/