2012-02-13 14 views
9

Sorumu umarım oldukça basittir. Formumu gönderdikten sonra, geçersiz karakterler (özellikle HTML) olan tüm özellikleri (alanları) model hataları olarak işaretlemek istiyorum. Karşılıklı konu modeli bağlama/doğrulama önce bu istek Doğrulama başladı ve ben HTTP 500 ... Ben senin Modeli/ViewModel üzerinde [AllowHtml] mülkiyet özelliğini kullanan veya <httpRuntime requestValidationMode="2.0" /> kullanarak ya tanıtır bir similar question gördü olsun web.config, ama aradığım şey, "Küresel olarak Doğrulama İsteği istisnalarını yakalamak ve bunları model hataları olarak gösterme" şeklindedir. Ayrıca, HTML etiketlerini "soymak" istemiyorum, kullanıcıya girişlerinin geçerli olmadığını bildirmek istiyorum.ASP.NET MVC3 Request Validation istisnaları, model veya özellik doğrulama hataları olarak nasıl ele alınır

Ben Normal İfade doğrulama kötü girişini bulmak için niteliklerini kullanma hakkında düşündüm ama belirtildiği gibi bu no-go yani, ASP.NET MVC3 iste Doğrulama .../doğrulama bağlama modeli önce gerçekleşir

Gerçekten good overview of the Request Validation can be found here.

+0

Sorunu anlatayım. Herhangi bir doğrulama hatası olduğunda, mülkünüzü arkaplanda işaretlemek ve bunları kod arkasında değiştirmek ister misiniz? –

cevap

10

Tek amacın, model bağlama sırasında İstek Doğrulama özel durumunu almak ve hataları model durumu hatası olarak göstermek olduğunu düşünüyorum. İşte Bu model devlet sadece istek denetimi istisna katacak

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(); 
    } 

örnek vardır. Üzgünüm, sorunuzu açık bir şekilde anlamıyorsam.

+0

Çalışır, ancak diğer özellikler gibi formlardaki değeri devam ettirmez ... – zam6ak

+0

@ zam6ak, System.Web.Helpers kullanarak ekleyin ve güncellenmiş cevabımı görün. Not, bu sadece hızlı bir cevaptır ve çok fazla optimize edilmez. Bunun için özür dilerim. –

+0

Bu işe yaramaz gibi görünüyor - Neden bu kadar hızlı bir şekilde oluşturduğumdan, bunun neden "çok fazla optimize edilmediğini" söylediğinizden emin değilim :) – zam6ak

İlgili konular