2012-09-03 22 views
14

मैं किसी तरह के एक कस्टम modelbinder उपयोग करने के लिए हमेशा ब्रिटेन प्रारूप में भेजे दिनांकों के इलाज के लिए की जरूरत है, मैं सेटअप कस्टम मॉडल बांधने की मशीन है और इतने की तरह पंजीकृत:Asp.Net वेब एपीआई - ModelBinders

GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new DateTimeModelBinder()); 

यह केवल मापदंडों querystring के लिए काम करने लगता है, और अगर मैं इतना की तरह मेरे पैरामीटर पर [ModelBinder] निर्दिष्ट ही काम करता है, वहाँ सभी कार्यों अपने मॉडल बांधने की मशीन का उपयोग करने के लिए मैं तरीका है:

public IList<LeadsLeadRowViewModel> Get([ModelBinder]LeadsIndexViewModel inputModel) 

इसके अलावा, मैं अपने पोस्ट कैसे प्राप्त कर सकते हैं मेरे मॉडल बांधने की मशीन का उपयोग करने के लिए मेरे एपीआई नियंत्रक के लिए फार्म?

उत्तर

5

मुझे लगता है कि आप न एक मॉडल बांधने की मशीन की जरूरत है। आपका दृष्टिकोण गलत है। तिथियों के लिए सही दृष्टिकोण क्लाइंट साइड वैश्वीकरण लाइब्रेरी का उपयोग कर रहा है जैसे globalize library किसी भी भाषा में स्वरूपित पर्सियों को पार्स करने और उन्हें जावास्क्रिप्ट डेट ऑब्जेक्ट्स में बदलने के लिए। फिर आप JSON में ब्राउज़र डेटा JSON.stringify के साथ अपने डेटास्क्रिप्ट डेटा संरचनाओं को क्रमबद्ध कर सकते हैं, और यह काम करना चाहिए। तारीखों के लिए हमेशा मानक प्रारूपों का उपयोग करना और मॉडल बाइंडर की बजाय फ़ॉर्मटर का उपयोग करना बेहतर है। यदि आप स्थानीय समय में या यूटीसी समय में दिनांक समय व्यक्त करते हैं, तो यह निर्धारित करने के लिए कि आप दयालु पैरामीटर अपने सी # डेटटाइम ऑब्जेक्ट्स का पैरामीटर निर्दिष्ट करते हैं, तो उपलब्ध प्रारूपक समय-समय पर सही ढंग से हैंडल करते हैं।

+0

पोस्ट करने से पहले मैं अपनी सभी तिथियों को क्लाइंट पक्ष पर आईएसओ प्रारूप में कैसे प्रारूपित करूं, क्या मुझे प्रत्येक दिनांक फ़ील्ड के लिए प्रत्येक पोस्ट से पहले मैन्युअल रूप से ऐसा करने की आवश्यकता है? थोड़ा थकाऊ और दोहराव लगता है? –

+0

बिलकुल नहीं! आप ब्राउज़र के JSON.stringify फ़ंक्शन को उस फ़ंक्शन को पास करके अनुकूलित कर सकते हैं जो तिथियों को पहचानता है और उन्हें पर्याप्त तारों में बदल देता है। एक बार ऐसा करने के बाद आप बस JSON.stringify को अपने सभी जेएस मॉडल को जेसन में –

+0

के सही प्रारूप के साथ कनवर्ट करने के लिए कॉल कर सकते हैं असल में, सभी मुख्य ब्राउज़र JSON.stringify फ़ंक्शन का डिफ़ॉल्ट व्यवहार दिनांकों को आईएसओ प्रारूप में परिवर्तित करना चाहिए .. इसलिए आपको कुछ भी करने की ज़रूरत नहीं है :) –

0

इसके लिए आपको कस्टम मॉडल बाइंडर की आवश्यकता नहीं है। यूके के लिए थ्रेड संस्कृति को बदलकर आपको अच्छा होना चाहिए या यूके के लिए अपना web.config settings सेट करना चाहिए, यदि आपकी साइट हर समय उपयोग की जा रही है।

यदि नहीं, तो आप अभी भी CurrentCulture के लिए DateTimeFormatInfo को यूके में बदल सकते हैं।

स्कॉट हंसेलमैन द्वारा मॉडल बाइंडर्स available here के बारे में भी एक अच्छी पोस्ट है।

आप Global.asax में इस डाल सकते हैं:

ModelBinders.Binders[typeof(DateTime)] = new DateAndTimeModelBinder() 
+4

मैंने इसे web.config में सेटिंग्स की कोशिश की है और यह एपीकंट्रोलर के लिए काम नहीं करता है, अगर मैं एक ही फॉर्म को एक एमवीसी नियंत्रक को पोस्ट करता हूं तो यह पूरी तरह से काम करता है, लेकिन एक एपीकंट्रोलर के लिए मेरी संस्कृति सेटिंग्स का सम्मान नहीं करता प्रतीत होता है। –

5

आप मॉडलबिन्डरप्रोवाइडर को कार्यान्वित करके और सेवाओं की सूची में डालने के द्वारा वैश्विक रूप से मॉडल बाइंडर पंजीकृत कर सकते हैं। Global.asax में

उदाहरण उपयोग:

GlobalConfiguration.Configuration.Services.Insert(typeof(ModelBinderProvider), 0, new Core.Api.ModelBinders.DateTimeModelBinderProvider()); 

नीचे एक ModelBinderProvider और एक ModelProvider implemenation है कि एक संस्कृति के बारे में पता ढंग में datetime तर्क धर्मान्तरित (वर्तमान धागे संस्कृति का प्रयोग करके) का प्रदर्शन उदाहरण कोड है,

DateTimeModelBinderProvider कार्यान्वयन:

using System; 
using System.Web.Http; 
using System.Web.Http.ModelBinding; 

...

public class DateTimeModelBinderProvider : ModelBinderProvider 
{ 
    readonly DateTimeModelBinder binder = new DateTimeModelBinder(); 

    public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType) 
    { 
     if (DateTimeModelBinder.CanBindType(modelType)) 
     { 
      return binder; 
     } 

     return null; 
    } 
} 

DateTimeModelBinder कार्यान्वयन:

public class DateTimeModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     ValidateBindingContext(bindingContext); 

     if (!bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName) || 
      !CanBindType(bindingContext.ModelType)) 
     { 
      return false; 
     } 

     bindingContext.Model = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName) 
      .ConvertTo(bindingContext.ModelType, Thread.CurrentThread.CurrentCulture); 

     bindingContext.ValidationNode.ValidateAllProperties = true; 

     return true; 
    } 

    private static void ValidateBindingContext(ModelBindingContext bindingContext) 
    { 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException("bindingContext"); 
     } 

     if (bindingContext.ModelMetadata == null) 
     { 
      throw new ArgumentException("ModelMetadata cannot be null", "bindingContext"); 
     } 
    } 

    public static bool CanBindType(Type modelType) 
    { 
     return modelType == typeof(DateTime) || modelType == typeof(DateTime?); 
    } 
} 
2

Attribute routing मॉडल बंधन के साथ संघर्ष करने लगता है। आप मार्ग विशेषता का उपयोग करते हैं, आप एक ही GlobalConfiguration.Config कॉल में global.asax विन्यास लपेट initialisation मुद्दों से बचने के कर सकते हैं:

GlobalConfiguration.Configure(config => 
{ 
    config.BindParameter(typeof(DateTime), new DateTimeModelBinder()); 
    config.MapHttpAttributeRoutes(); 
} 

(यह आगामी एएसपी में तय हो सकता है।नेट 5 अगर यह bug #1165 से संबंधित है।)

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