2012-02-13 26 views
9

Câu hỏi của tôi hy vọng là khá thẳng về phía trước. Khi gửi biểu mẫu của tôi, tôi muốn gắn cờ tất cả thuộc tính (trường) có ký tự không hợp lệ (cụ thể là HTML) làm lỗi mô hình. Vấn đề tôi đang phải đối mặt là đá Yêu cầu Validation trong trước mô hình ràng buộc/xác nhận và tôi nhận được HTTP 500 ... tôi thấy một similar question rằng quảng cáo hoặc sử dụng thuộc tính [AllowHtml] tài sản trên Model của bạn/ViewModel hoặc sử dụng <httpRuntime requestValidationMode="2.0" /> trong web.config, nhưng những gì tôi đang tìm kiếm là cách "ngoại lệ xác thực yêu cầu bắt trên toàn cầu và hiển thị chúng dưới dạng lỗi mô hình". Hơn nữa, tôi không muốn "tách" các thẻ HTML, tôi muốn thông báo cho người dùng rằng đầu vào của họ không hợp lệ.Làm thế nào để xử lý các trường hợp ngoại lệ xác thực yêu cầu ASP.NET MVC3 như lỗi xác thực mô hình hoặc thuộc tính

Tôi nghĩ về việc sử dụng thường xuyên xác nhận Biểu hiện thuộc tính để tìm đầu vào xấu, nhưng như tôi đã đề cập, Yêu cầu Validation trên ASP.NET MVC3 xảy ra trước khi mô hình ràng buộc/xác nhận, vì vậy đó là một không-go ...

A thực sự good overview of the Request Validation can be found here.

+0

Hãy để tôi hiểu vấn đề của bạn. Bạn muốn gắn cờ các thuộc tính của mình trong mã-đằng sau và thao tác chúng trong mã-đằng sau khi có bất kỳ lỗi xác thực nào? –

Trả lời

10

Tôi nghĩ ý định duy nhất của bạn là nhận ngoại lệ Yêu cầu xác thực trong quá trình ràng buộc mô hình và hiển thị lỗi dưới dạng lỗi trạng thái mô hình. Dưới đây là các mẫu,

using System.Web.Helpers; 
    public class MyModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      try 
      { 
       return base.BindModel(controllerContext, bindingContext); 
      } 
      catch(HttpRequestValidationException ex) 
      { 
       var modelState = new ModelState(); 
       modelState.Errors.Add(ex.Message); 
       var key=bindingContext.ModelName; 
       var value = controllerContext.RequestContext.HttpContext.Request.Unvalidated().Form[key]; 
       modelState.Value = new ValueProviderResult(value, value,CultureInfo.InvariantCulture); 
       bindingContext.ModelState.Add(key, modelState); 
      } 
      return null; 
     } 
    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

này sẽ bổ sung thêm ngoại trừ chỉ xác nhận yêu cầu trong tình trạng mô hình. Xin lỗi, nếu tôi không hiểu rõ câu hỏi của bạn.

+0

Nó hoạt động, nhưng không tồn tại giá trị trên các biểu mẫu như các thuộc tính khác ... – zam6ak

+0

@ zam6ak, Thêm bằng cách sử dụng System.Web.Helpers và xem câu trả lời cập nhật của tôi. Lưu ý, đây chỉ là câu trả lời nhanh và không được tối ưu hóa nhiều lắm. Xin lỗi vì chuyện đó. –

+0

Điều này dường như hoạt động độc đáo - Tôi không chắc tại sao bạn lại nói "không được tối ưu hóa nhiều" :) – zam6ak

Các vấn đề liên quan