Bạn có một vài lựa chọn.
Trên mô hình, hãy thêm thuộc tính này vào từng thuộc tính mà bạn cần để cho phép HTML - lựa chọn tốt nhất
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
Trên hành động của bộ điều khiển, hãy thêm thuộc tính này để cho phép tất cả HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Brute force trong web.config - chắc chắn không được khuyến khích
Trong tệp web.config, bên trong các thẻ, hãy chèn phần tử httpRuntime với thuộc tính requestValidationMode = "2.0". Cũng thêm thuộc tính validateRequest = "false" trong phần tử trang.
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Thông tin thêm: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Phần trên phù hợp với cách sử dụng của trình mô hình mặc định.
Mô hình tùy chỉnh
Có vẻ như lời gọi đến bindContext.ValueProvider.GetValue () trong đoạn mã trên luôn xác thực dữ liệu, bất kể thuộc tính nào. Tìm hiểu kỹ các nguồn ASP.NET MVC cho thấy rằng trước tiên, DefaultModelBinder sẽ kiểm tra xem có cần xác thực yêu cầu hay không và sau đó gọi phương thức bindContext.UnvalidatedValueProvider.GetValue () với một tham số cho biết có cần xác thực hay không.
Thật không may, chúng tôi không thể sử dụng bất kỳ mã khung nào vì nó được niêm phong, riêng tư hoặc bất cứ thứ gì để bảo vệ những nhà phát triển thiếu hiểu biết khỏi làm những điều nguy hiểm, nhưng không quá khó để tạo một chất kết dính mô hình tùy chỉnh hoạt động tôn trọng các thuộc tính AllowHtml và 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...
}
}
}
Phần bắt buộc khác là một cách để truy xuất một giá trị chưa được xác thực. Trong ví dụ này, chúng tôi sử dụng một phương thức mở rộng cho lớp 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);
}
}
Thông tin thêm về điều này tại http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/