Hai alcune opzioni.
Sul modello aggiungi questo attributo a ciascuna proprietà di cui hai bisogno per consentire HTML: la scelta migliore
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
Nell'azione del controller aggiungere questo attributo per consentire tutto l'HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Forza bruta in web.config - decisamente sconsigliato
Nel file web.config, all'interno dei tag, inserire l'elemento httpRuntime con l'attributo requestValidationMode = "2.0". Aggiungi anche l'attributo validateRequest = "false" nell'elemento pages.
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Maggiori informazioni: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Quanto sopra funziona per gli usi del modelbinder predefinito.
ModelBinder personalizzato
Sembra che una chiamata a bindingContext.ValueProvider.GetValue () nel codice precedente convalidi sempre i dati, indipendentemente dagli attributi. L'analisi delle origini ASP.NET MVC rivela che DefaultModelBinder verifica prima se è richiesta la convalida della richiesta e quindi chiama il metodo bindingContext.UnvalidatedValueProvider.GetValue () con un parametro che indica se la convalida è richiesta o meno.
Sfortunatamente non possiamo utilizzare nessuno dei codici del framework perché è sigillato, privato o qualsiasi altra cosa per proteggere gli sviluppatori ignoranti dal fare cose pericolose, ma non è troppo difficile creare un raccoglitore di modelli personalizzato funzionante che rispetti gli attributi 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...
}
}
}
L'altro pezzo richiesto è un modo per recuperare un valore non convalidato. In questo esempio utilizziamo un metodo di estensione per 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);
}
}
Maggiori informazioni su questo su http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/