2009-09-28 21 views
19

Genel bir model için model ciltleyici oluşturmak mümkün mü? Bir türü varsa Örneğin,Genel Tür için ASP.NET MVC Model Binder

public class MyType<T> 

MyType her tür için çalışacak bir özel modeli cilt oluşturmak için herhangi bir yolu var mı?

sayesinde Nathan

cevap

25

, BindModel geçersiz bir ModelBinder oluşturma türünü kontrol ve

public class MyModelBinder 
    : DefaultModelBinder { 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 

     if (HasGenericTypeBase(bindingContext.ModelType, typeof(MyType<>)) { 
      // do your thing 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Global.asax içinde varsayılan modeliniz bağlayıcı ayarlayın yapmanız gerekeni yapın

jenerik tabanını eşleştirmek için
protected void Application_Start() { 

     // Model Binder for My Type 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

çekler

private bool HasGenericTypeBase(Type type, Type genericType) 
    { 
     while (type != typeof(object)) 
     { 
      if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) return true; 
      type = type.BaseType; 
     } 

     return false; 
    } 
+16

Bu soru hâlâ google'ın sonuçlarında oldukça yüksek olduğu için MVC3 ile ortaya çıkan daha iyi bir çözümün [Model Binder Sağlayıcıları] (http://bradwilson.typepad.com/) kullanacağından bahsetmek isterim. Blog/2010/10/hizmet konum PT9-model binders.html). Bu, yaptığınız tek şey, eğer yaptığınız tek şey, _particular_ türünü ciltlemek için özel kurallar eklemeye çalışıyorsa, varsayılan bağlayıcısını değiştirmek zorunda kalmamanızdır, bu da özel model bağlama işlemini çok daha ölçeklenebilir hale getirir. –

+0

Mvc 2 uygulamasında her tür için özel model bağlayıcı ayarlamayı öğrenmek için uğraşıyordum. Ve çözüm budur! Çok teşekkürler! – blazkovicz