Vous avez quelques options.
Sur le modèle, ajoutez cet attribut à chaque propriété pour laquelle vous souhaitez autoriser le HTML - meilleur choix
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
Sur l'action du contrôleur, ajoutez cet attribut pour autoriser tout le HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Brute force dans web.config - définitivement non recommandé
Dans le fichier web.config, à l'intérieur des balises , insérez l'élément httpRuntime avec l'attribut requestValidationMode="2.0". Ajoutez également l'attribut validateRequest="false" dans l'élément pages.
Plus d'infos : http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Le procédé ci-dessus fonctionne pour les utilisations du modelbinder par défaut.
ModelBinder personnalisé
Il semble qu'un appel à bindingContext.ValueProvider.GetValue() dans le code ci-dessus valide toujours les données, quelles que soient les attributs. En examinant le code source de ASP.NET MVC, on découvre que DefaultModelBinder vérifie d'abord si la validation de la requête est requise, puis appelle la méthode bindingContext.UnvalidatedValueProvider.GetValue() avec un paramètre indiquant si la validation est requise ou non.
Malheureusement, nous ne pouvons pas utiliser le code du framework car il est scellé, privé ou autre pour protéger les développeurs ignorants de faire des choses dangereuses, mais il n'est pas trop difficile de créer un model binder personnalisé fonctionnel qui respecte les attributs AllowHtml et ValidateInput :
public class MyModelBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// Vérifie d'abord si la validation de la requête est nécessaire
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
// Obtenir la valeur
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
var theValue = valueProviderResult.AttemptedValue;
// etc...
}
}
}
L'autre morceau requis est une façon de récupérer une valeur non validée. Dans cet exemple, nous utilisons une méthode d'extension pour la 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);
}
}
Plus d'infos à ce sujet sur http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/