2009-09-28 22 views
19

के लिए एएसपी.नेट एमवीसी मॉडल बाइंडर सामान्य प्रकार के लिए मॉडल बाइंडर बनाना संभव है? उदाहरण के लिए, अगर मैं एक प्रकार हैसामान्य प्रकार

public class MyType<T> 

वहाँ कस्टम मॉडल बांधने की मशीन है कि MyType के किसी भी प्रकार के लिए काम करेंगे बनाने के लिए कोई तरीका है?

धन्यवाद, नाथन

उत्तर

25

एक modelbinder बनाएँ, BindModel ओवरराइड, प्रकार की जाँच करें और आप

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 में डिफ़ॉल्ट करने के लिए अपने मॉडल बांधने की मशीन सेट करने की जरूरत है कि क्या करना

protected void Application_Start() { 

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

सामान्य आधार मिलान के लिए चेक

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

चूंकि यह प्रश्न अभी भी Google के परिणामों पर बहुत अधिक है, इसलिए मैं यह उल्लेख करना चाहता हूं कि शायद एमवीसी 3 के साथ आने वाला एक बेहतर समाधान [मॉडल बाइंडर प्रदाता] का उपयोग करना है (http://bradwilson.typepad.com/ ब्लॉग/2010/10/सेवा-स्थान-pt9-मॉडल-binders.html)। ऐसा इसलिए होता है कि आपको डिफ़ॉल्ट बाइंडर को प्रतिस्थापित करने की आवश्यकता नहीं है यदि आप जो कुछ कर रहे हैं वह _particular_ प्रकार को बाध्य करने के लिए विशेष नियम जोड़ने का प्रयास कर रहा है, जो कस्टम मॉडल को अधिक स्केलेबल बाध्यकारी बनाता है। –

+0

मैं एमवीसी 2 एप्लिकेशन में सभी प्रकार के लिए कस्टम मॉडल बाइंडर सेट करने का तरीका खोजने के लिए संघर्ष कर रहा था। और यहां समाधान है! आपका बहुत बहुत धन्यवाद! – blazkovicz

संबंधित मुद्दे