Anda punya beberapa pilihan.
Pada model, tambahkan atribut ini ke setiap properti yang Anda perlukan untuk mengizinkan HTML - pilihan terbaik
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
Pada tindakan pengontrol, tambahkan atribut ini untuk mengizinkan semua HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Brute force di web.config - sangat tidak direkomendasikan
Di file web.config, di dalam tag, masukkan elemen httpRuntime dengan atribut requestValidationMode = "2.0". Tambahkan juga atribut validateRequest = "false" di elemen halaman.
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Info lebih lanjut: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Di atas bekerja untuk penggunaan modelbinder default.
ModelBinder Kustom
Tampaknya panggilan ke bindingContext.ValueProvider.GetValue () dalam kode di atas selalu memvalidasi data, apa pun atributnya. Menggali ke dalam sumber ASP.NET MVC mengungkapkan bahwa DefaultModelBinder pertama memeriksa apakah validasi permintaan diperlukan dan kemudian memanggil metode bindingContext.UnvalidatedValueProvider.GetValue () dengan parameter yang menunjukkan apakah validasi diperlukan atau tidak.
Sayangnya kami tidak dapat menggunakan kode kerangka kerja apa pun karena tersegel, pribadi, atau apa pun untuk melindungi pengembang yang tidak tahu dari melakukan hal-hal berbahaya, tetapi tidak terlalu sulit untuk membuat pengikat model khusus yang berfungsi yang menghormati atribut AllowHtml dan 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...
}
}
}
Bagian lain yang diperlukan adalah cara untuk mengambil nilai yang tidak divalidasi. Dalam contoh ini kami menggunakan metode ekstensi untuk kelas 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);
}
}
Info lebih lanjut tentang ini di http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/