J'ai essayé de trouver une solution à ce problème toute la journée.
La désactivation de la validation n'était pas une option.
L'ajout de allowHtml n'était pas non plus une option, car par la spécification msdn :
AllowHtmlAttribute permet à une demande d'inclure un balisage HTML pendant la liaison du modèle en ignorant la validation de la demande pour la propriété. source
De plus, il y a beaucoup de propriétés avec des attributs de chaîne dans un projet qui devraient être validées si la validation par défaut est définie sur false.
Solution :
J'ai créé une classe CustomRequestValidation :
public class CustomRequestValidation : System.Web.Util.RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
validationFailureIndex = -1;
if (requestValidationSource == RequestValidationSource.RawUrl)
return true;
if (requestValidationSource == RequestValidationSource.Form)
{
var isValid = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
if (!isValid)
{
validationFailureIndex = -1;
return true;
}
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
ce qu'il fait, c'est qu'il saute simplement la RequestValidation dans le but d'atteindre l'état du modèle.
Ensuite, j'ai remplacé le modèle de classeur par défaut :
public class CustomModelBinder : DefaultModelBinder
{
protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
if (value != null)
{
if (propertyDescriptor.PropertyType == typeof(string))
{
string val = value.ToString();
int validationIndex;
var isValid = new System.Web.Util.RequestValidator().InvokeIsValidRequestString(controllerContext.HttpContext.ApplicationInstance.Context, val, RequestValidationSource.Form, null, out validationIndex);
if (!isValid && !propertyDescriptor.Attributes.OfType<AllowHtmlAttribute>().IsAny())
{
var key = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
bindingContext.ModelState.AddModelError(key, ErrorConstants.SpecialCharacters);
}
}
}
return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
}
}
Maintenant, ici, nous faisons toute la validation. Dans le binder du modèle, j'appelle la méthode par défaut .Net IsValidRequestString et je vérifie si AllowHtml a été défini et je définis l'état du modèle en conséquence. Cela me donne le contrôle sur les données et je peux retourner à la page et remplir le formulaire avec les données précédemment saisies sans déclencher de scripts insérés. J'utilise des modèles fortement typés.