2012-03-28 5 views
24

मुझे यह जानने की जरूरत है कि एमवीसी 4 में कस्टम IModelBinder कैसे बनाया जाए और इसे बदल दिया गया है।एमवीसी 4 मॉडलबिन्डर

नई विधि है कि लागू किया जाना है:

bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext); 

उत्तर

27

2 IModelBinder इंटरफेस के होते हैं:

  1. System.Web.Mvc.IModelBinder जो पिछले संस्करणों में रूप में ही है और नहीं बदला है
  2. System.Web.Http.ModelBinding.IModelBinder जिसका उपयोग वेब एपीआई और एपीकंट्रोलर द्वारा किया जाता है। तो मूल रूप से इस विधि के अंदर आपको actionContext.ActionArguments को संबंधित मानों पर सेट करना होगा। अब आप एक मॉडल उदाहरण वापस नहीं करते हैं।
+0

येस, धन्यवाद डारिन। –

+3

एक कस्टम मॉडल बांधने की मशीन भी पंजीकृत करने के लिए है। एएसपी.Net वेब एपीआई के पास एमवीसी 3 जैसा ही नहीं है। एमवीसी 4 बीटा में इसे कैसे करें इसे देखने के लिए [इस पोस्ट] (http://forums.asp.net/t/1773706.aspx/1) देखें। उत्तर के निचले हिस्से को समझना मुश्किल है, लेकिन ध्यान दें कि आपने इसे 'global.asax.cs' में' GlobalConfiguration.Configuration.ServiceResolver.GetServices ... ' – Steve

24

This link, स्टीव द्वारा प्रदान किया गया, एक पूर्ण उत्तर प्रदान करता है। मैं इसे संदर्भ के लिए यहां जोड़ रहा हूं। क्रेडिट asp.net मंचों पर dravva जाता है।

सबसे पहले, IModelBinder से प्राप्त कक्षा बनाएं। जैसा कि डारिन कहते हैं, System.Web.Http.ModelBinding नामस्थान का उपयोग करना सुनिश्चित करें और परिचित एमवीसी समकक्ष नहीं।

public class CustomModelBinder : IModelBinder 
{ 
    public CustomModelBinder() 
    { 
     //Console.WriteLine("In CustomModelBinder ctr"); 
    } 

    public bool BindModel(
     HttpActionContext actionContext, 
     ModelBindingContext bindingContext) 
    { 
     //Console.WriteLine("In BindModel"); 
     bindingContext.Model = new User() { Id = 2, Name = "foo" }; 
     return true; 
    } 
} 

इसके बाद, एक प्रदाता है, जो अपने नए बांधने की मशीन के लिए एक कारखाने के रूप में कार्य प्रदान करते हैं और किसी भी अन्य बाइंडरों आप भविष्य में जोड़ सकते हैं।

public class CustomModelBinderProvider : ModelBinderProvider 
{ 
    CustomModelBinder cmb = new CustomModelBinder(); 
    public CustomModelBinderProvider() 
    { 
     //Console.WriteLine("In CustomModelBinderProvider ctr"); 
    } 

    public override IModelBinder GetBinder(
     HttpActionContext actionContext, 
     ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType == typeof(User)) 
     { 
      return cmb; 
     } 

     return null; 
    } 
} 

अंत में, अपने Global.asax.cs (उदा।, अनुप्रयोग_स्टार्ट) में निम्नलिखित शामिल करें।

var configuration = GlobalConfiguration.Configuration; 

IEnumerable<object> modelBinderProviderServices = configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider)); 
List<Object> services = new List<object>(modelBinderProviderServices); 
services.Add(new CustomModelBinderProvider()); 
configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray()); 

अब, आप अपने कार्य विधियों के पैरामीटर के रूप में नए प्रकार को केवल डेल कर सकते हैं।

public HttpResponseMessage<Contact> Get([ModelBinder(typeof(CustomModelBinderProvider))] User user) 

या यहाँ तक कि

public HttpResponseMessage<Contact> Get(User user) 
+0

के साथ सेट किया है, मुझे विश्वास है, जब तक आप स्पष्ट रूप से [मॉडलबिंडर (टाइपऑफ (कस्टममोडेल बाइंडरप्रोवाइडर))] आपकी कार्रवाई में, आपको ModelBinderProvider की आवश्यकता नहीं है। –

3

टोड के पोस्ट करने के लिए एक पोस्ट आर सी अद्यतन: जोड़ने के लिए

var configuration = GlobalConfiguration.Configuration; 

configuration.Services.Add(typeof(ModelBinderProvider), new YourModelBinderProvider()); 
+1

यह मेरे लिए काम किया। क्या वैश्विक स्तर पर ऐसा करने का कोई तरीका है, यानी डिफ़ॉल्ट मॉडल बाइंडर सेट करें? –

8

इससे भी आसान तरीका:

अपने मॉडल बांधने की मशीन प्रदाता सरलीकृत किया गया है जोड़ा जा रहा है मॉडलबिन्डरप्रोवाइडर के बिना एक मॉडलबिन्डर यह है:

GlobalConfiguration.Configuration.BindParameter(typeof(User), new CustomModelBinder()); 
+0

यह पूरी तरह से काम किया! किसी भी कारण से मुझे इस पृष्ठ पर एमवीसी 4 के साथ काम करने के लिए अन्य कोई उदाहरण नहीं मिल सका। लगता है कि ModelBinderProvider के लिए इंटरफ़ेस बदल गया है। लेकिन ModelBinderProvider को हटाकर और इस कोड को Application_Start में जोड़कर बहुत अच्छा काम किया! –