2012-04-10 17 views
5

तो ऐसा लगता है कि कई लोगों (जैसे here और here) में एमवीसी 4 मॉडल के साथ समस्याएं हैं जो एपीकंट्रोलर के लिए बाध्यकारी हैं, लेकिन उनमें से कोई भी मुझे जो समस्या दिखाई दे रहा है उसे काफी हल नहीं कर रहा है।मैं एमवीसी 4 में कस्टम मॉडल बाइंडर कैसे लगा सकता हूं?

मैं वास्तव में करना चाहता हूं कि पूर्णांक की सूचियों के लिए सरणी बाध्यकारी व्यवहार को बदलना है। तो कहते हैं कि मैं इस तरह के अनुरोध प्रकार था:

public class MyRequestModel 
{ 
    public List<long> ListOfIntegers { get; set; } 

    ... 
} 

और इस जैसी API GET विधि:

public ResultsResponseModel Get(MyRequestModel request) 
{ 
    // use request.ListOfIntegers meaningfully 

    ... 

    return response; 
} 

मैं मूल रूप से /api/results/?listOfIntegers=1+2+3+4+5 कहना और List<long> संपत्ति है कि संकल्प के लिए सक्षम होना चाहता हूँ।

मैंने अपने सामान्य मॉडल बाध्यकारी चाल की कोशिश की है, लेकिन एमवीसी 4 में अधिकांश वेब एपीआई के साथ मॉडल बाध्यकारी के लिए यह एक बिल्कुल अलग रास्ता प्रतीत होता है।

दूर मैं MyRequestModel पर एक System.Web.Http.ModelBinding.ModelBinder विशेषता का उपयोग कर रहा है, और एक मॉडल बांधने की मशीन है कि "कार्यान्वित" System.Web.Http.ModelBinding.IModelBinder बनाने मिल गया है। यह लगातार स्टैक निशान के साथ ऑब्जेक्ट संदर्भ अपवाद उत्पन्न करता है जो कभी भी मेरे कोड को स्पर्श नहीं करता है।

किसी ने इसे मारा? आगे क्या प्रयास करने के बारे में विचार है?

अद्यतन: यहाँ एक स्टैक ट्रेस कि मैं अपने कस्टम ExceptionFilterAttribute में कब्जा है या नहीं:

Object reference not set to an instance of an object. 
    at System.Web.Http.ModelBinding.DefaultActionValueBinder.BindParameterValue(HttpActionContext actionContext, HttpParameterBinding parameterBinding) 
    at System.Web.Http.ModelBinding.DefaultActionValueBinder.<>c__DisplayClass1.BindValuesAsync>b__0(RequestContentReadKind contentReadKind) 
    at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass38.<ToAsyncVoidTask>b__37() 
    at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken) 
+0

क्या आप स्टैक ट्रेस सबमिट कर सकते हैं? – jorgehmv

+0

बस स्टैक ट्रेस –

उत्तर

4

आप ApiControllers बात कर रहे हैं, तो आप वेब एपीआई में बाँध मॉडल और अब MVC की कोशिश कर रहे यहां एक नमूना मॉडल बांधने की मशीन

public class MyRequestModelBinderProvider : ModelBinderProvider 
    { 
     MyRequestModelBinder binder = new MyRequestModelBinder(); 
     public IdeaModelBinderProvider() 
     {   
     } 

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

      return null; 
     } 
    } 

है यहाँ एक कस्टम मॉडल बांधने की मशीन प्रदाता

दर्ज की का एक उदाहरण है 210
IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider)); 
List<Object> services = new List<object>(modelBinderProviderServices); 
services.Add(new MyRequestModelBinderProvider()); 
GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray()); 

अब आप अपने कस्टम मॉडल बांधने की मशीन में आप क्वेरी स्ट्रिंग को महत्व देता

public class MyRequestModelBinder : IModelBinder 
    { 
     public MyRequestModelBinder() 
     { 

     } 

     public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
     { 
      MyRequestModel yourModel; 
      //use contexts to access query string values 
      //create/update your model properties 

      bindingContext.Model = yourModel; 
      //return true || false if binding is successful 
     } 

अपनी कक्षाओं और वेबएपीआई के लिए इंटरफेस और नहीं MVC का उपयोग कर सुनिश्चित करें कि उपयोग करने के लिए संदर्भों का उपयोग करें। कुछ नाम समान हैं, लेकिन अलग-अलग नामस्थान और डीएलएस

+0

ठीक है इसलिए मुझे लगता है कि मुझे सही संरचना मिल गई है। क्या आपको पता है कि डिफ़ॉल्ट वेब एपीआई मॉडल बाध्यकारी का आह्वान करने का कोई तरीका है और फिर मॉडल बाइंडर के भीतर मैन्युअल रूप से सूची मूल्य मानकों का नियंत्रण लेना है? –

+0

कॉल बेस। अपने कस्टम मॉडलबिन्डर में गेटबिंडर डिफ़ॉल्ट मॉडल बाइंडर प्राप्त करने के लिए प्रदान करें, और इसे अपने कस्टम मॉडल बाइंडर के निजी दायर में डाल दें, ताकि आप इसे अपने मॉडल बाइंडर से उपयोग कर सकें। –

+0

@ फ्रांसेस्कोएबब्रूज़िस मुझे ऐसा कुछ करना अच्छा लगेगा - दुर्भाग्यवश, चूंकि हम मॉडलबिन्डरप्रोवाइडर से विरासत में हैं, जो एक अमूर्त आधार गेटबिंडर विधि वाला एक सार वर्ग है, मेरे लिए जाने के लिए कोई डिफ़ॉल्ट तैयार नहीं है। मैंने बिना सिस्टम के 'System.Web.Http.Modelbinding.ModelBinders' में प्रकारों से तत्काल भेजने की कोशिश की है। कोई अन्य विचार? –