2014-10-14 6 views
10

मैं एक WebAPI विधि है, इस तरह:कस्टम बूलियन पैरामीटर बाइंडिंग

public string Get([FromUri] SampleInput input) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

इनपुट इस तरह परिभाषित किया गया है:

public class SampleInput 
{ 
    // ...other fields 
    public bool IsAwesome { get; set; } 
} 

यह है के रूप में, यह ठीक काम करता है: अगर मैं &isAwesome=true पारित क्वेरी स्ट्रिंग में, पैरामीटर मान true के साथ शुरू होता है।

मेरे समस्या यह है कि मैं true मूल्यों के रूप में दोनों &isAwesome=true और &isAwesome=1 स्वीकार करना पसंद करते है। वर्तमान में, दूसरे संस्करण के परिणामस्वरूप इनपुट मॉडल में IsAwesomefalse होगा। का उपयोग कर

public class BooleanNumericParameterBinding : HttpParameterBinding 
{ 
    private static readonly HashSet<string> TrueValues = 
     new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase); 

    public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor) 
    { 
    } 

    public override Task ExecuteBindingAsync(
     ModelMetadataProvider metadataProvider, 
     HttpActionContext actionContext, 
     CancellationToken cancellationToken) 
    { 
     var routeValues = actionContext.ControllerContext.RouteData.Values; 

     var value = (routeValues[Descriptor.ParameterName] ?? 0).ToString(); 

     return Task.FromResult(TrueValues.Contains(value)); 
    } 
} 

... और में यह रजिस्टर Global.asax.cs,:


मैं क्या करने की कोशिश की, इस विषय पर विभिन्न ब्लॉग पोस्ट को पढ़ने के बाद, एक HttpParameterBinding परिभाषित करने के लिए था :

var pb = GlobalConfiguration.Configuration.ParameterBindingRules; 
pb.Add(typeof(bool), p => new BooleanNumericParameterBinding(p)); 

और

var pb = GlobalConfiguration.Configuration.ParameterBindingRules; 
pb.Insert(0, typeof(bool), p => new BooleanNumericParameterBinding(p)); 

इनमें से कोई नहीं काम किया। मेरे कस्टम HttpParameterBinding बुलाया जा रहा है नहीं कर रहा है और मैं अभी भी मूल्य 1false में अनुवाद मिलता है।

मैं Booleans के लिए 1true मान को स्वीकार करने के लिए वेबएपीआई को कैसे कॉन्फ़िगर कर सकता हूं?

संपादित करें: मैंने जो उदाहरण प्रस्तुत किया है वह जानबूझकर सरलीकृत है। मेरे पास मेरे आवेदन में बहुत से इनपुट मॉडल हैं और उनमें कई बुलियन फ़ील्ड हैं जिन्हें मैं ऊपर वर्णित तरीके से संभालना चाहता हूं। अगर यह सिर्फ एक क्षेत्र था, तो मैं इस तरह के जटिल तंत्र का उपयोग नहीं करता।

+0

मेरे पास एक वर्कअराउंड सुझाव है, 'नमूना इनपुट' में 'IsAwesome1' कहें और स्ट्रिंग के रूप में' IsAwesome 'बनाएं,' IsAwesome1' = केवल तभी सेट करें यदि 'IsAwesome '=' "1" 'या' "सत्य है "' –

+0

@ArindamNayak मेरे उदाहरण में एक और है कि कोड ब्लोट की तरह बस भी कई क्षेत्रों रहे हैं। मैंने सोचा कि वेब एपीआई में ऐसा करने का एक और शानदार तरीका था।मैं इस समय के लिए एमवीसी में वापस आ रहा हूँ; मेरे पास 'IModelBinder' है जो नौकरी अच्छी तरह से करता है। – GolfWolf

उत्तर

4

FromUriAttribute साथ पैरामीटर सजाने की तरह लग रहा सिर्फ पैरामीटर नियम बाध्यकारी पूरी तरह छोड़ देता है।

public string Get([FromUri] bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

और बूलियन नियम अब भी नहीं बुलाया जा रहा है (IsAwesomenull के रूप में आ रहा है जब आप &isAwesome=1 कहते हैं): मैं एक साधारण bool साथ SampleInput इनपुट पैरामीटर की जगह एक साधारण परीक्षण किए गए। आप FromUri विशेषता को हटाने जैसे ही:

public string Get(bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

नियम कहा जाता हो जाता है और पैरामीटर सही ढंग से बंधे हुए। FromUriAttribute वर्ग बंद है, इसलिए मुझे लगता है तुम बहुत ज्यादा खराब कर रहे हैं - अच्छी तरह से, आप हमेशा यह reimplement और अपने वैकल्पिक बूलियन बाध्यकारी तर्क^_^शामिल कर सकते हैं।

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