Você tem poucas opções.
No modelo, adicione este atributo a cada propriedade que você precisa para permitir HTML - melhor escolha
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
Na ação do controlador, adicione este atributo para permitir todo o HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Força bruta em web.config - definitivamente não recomendado
No arquivo web.config, dentro das tags, insira o elemento httpRuntime com o atributo requestValidationMode = "2.0". Adicione também o atributo validateRequest = "false" no elemento pages.
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Mais informações: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
O acima funciona para usos do modelbinder padrão.
Custom ModelBinder
Parece que uma chamada para bindingContext.ValueProvider.GetValue () no código acima sempre valida os dados, independentemente de quaisquer atributos. Investigar as fontes ASP.NET MVC revela que o DefaultModelBinder primeiro verifica se a validação da solicitação é necessária e, em seguida, chama o método bindingContext.UnvalidatedValueProvider.GetValue () com um parâmetro que indica se a validação é necessária ou não.
Infelizmente, não podemos usar nenhum código do framework porque ele é selado, privado ou qualquer outra coisa para proteger desenvolvedores ignorantes de coisas perigosas, mas não é muito difícil criar um fichário de modelo personalizado funcional que respeite os atributos AllowHtml e ValidateInput:
public class MyModelBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// 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...
}
}
}
A outra parte necessária é uma forma de recuperar um valor não validado. Neste exemplo, usamos um método de extensão para a classe 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);
}
}
Mais informações sobre isso em http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/