Masz kilka opcji.
W modelu dodaj ten atrybut do każdej właściwości, której potrzebujesz, aby zezwolić na HTML - najlepszy wybór
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
W akcji kontrolera dodaj ten atrybut, aby zezwolić na cały kod HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Brute force w web.config - zdecydowanie nie zalecane
W pliku web.config, w obrębie tagów, wstaw element httpRuntime z atrybutem requestValidationMode = "2.0". Dodaj również atrybut validateRequest = "false" w elemencie pages.
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Więcej informacji: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Powyższe działa w przypadku użycia domyślnego segregatora modelu.
Niestandardowy modelBinder
Wygląda na to, że wywołanie bindingContext.ValueProvider.GetValue () w powyższym kodzie zawsze sprawdza poprawność danych, niezależnie od atrybutów. Przeglądanie źródeł ASP.NET MVC ujawnia, że DefaultModelBinder najpierw sprawdza, czy weryfikacja żądania jest wymagana, a następnie wywołuje metodę bindingContext.UnvalidatedValueProvider.GetValue () z parametrem wskazującym, czy walidacja jest wymagana, czy nie.
Niestety nie możemy użyć żadnego z kodu frameworka, ponieważ jest on zapieczętowany, prywatny lub cokolwiek innego, aby chronić nieświadomych programistów przed robieniem niebezpiecznych rzeczy, ale nie jest zbyt trudne stworzenie działającego spoiwa modelu niestandardowego, który respektuje atrybuty AllowHtml i 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;
}
}
}
Drugi wymagany element to sposób na odzyskanie niepotwierdzonej wartości. W tym przykładzie używamy metody rozszerzającej dla klasy 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);
}
}
Więcej informacji na ten temat na http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/