2013-08-07 6 views
5

से जटिल प्रकार के लिए बाइंडिंग मैं ASP.net WebAPI पैरामीटर यूआरआई

URL, इस तरह एक प्रारूप की होनी चाहिए .net 4.5

पर ASP.net WebAPI का उपयोग कर एक बाकी वेब सेवा बनाना चाहते हैं:

/values?Age=55&Height=176&Race=1&Weight=80&Gender=male&id=800001 

जुड़े नियंत्रक इस तरह दिखता है:

[HttpGet] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

कहाँ जनसांख्यिकी मूल रूप से कुछ गुणों के साथ सिर्फ एक डीटीओ एक कस्टम वस्तु है।

enum Gender 
{ 
Female = 0, 
Male 
} 

डिफ़ॉल्ट मानचित्रण बस ठीक काम करता है अगर ऊपर दिया गया URL स्वरूप की है: हालांकि, यह एक संपत्ति एक कस्टम enum के प्रकार है कि होता है। हालांकि, निश्चित रूप से मुझे यह भी जांचना होगा कि यूआरएल द्वारा प्रदान किए गए पैरामीटर सही हैं या नहीं।

प्रति डिफ़ॉल्ट एएसपीनेट वेबएपी (afaik) अनुमानित प्रकार के आधार पर प्रत्येक पैरामीटर को मैप करने की कोशिश करता है (या यदि इसे उस प्रकार में परिवर्तित किया जा सकता है)। यदि यह यूआरआई में एक मिलान मूल्य नहीं पा रहा है तो ऐसा लगता है कि यह सिर्फ 0

अब यह मुझे एक बहुत ही दुर्भाग्यपूर्ण स्थिति में ले जाता है जहां 0 परिभाषा के अनुसार लिंग जनसांख्यिकी के लिए अभी भी एक मान्य मूल्य है। लिंग (0 ~ लिंग। महिला)।

सबसे आसान समाधान enum को बदलना होगा ताकि 0 एक "अनिश्चित" स्थिति हो जिसे मैं जांच सकूं। हालांकि, मैं enum बदल नहीं सकता है। मैं जनसांख्यिकीय वस्तु के लिए अपना स्वयं का अधिभार बना सकता हूं लेकिन ऐसा नहीं करता, क्योंकि मुझे लगता है कि वहां एक अच्छा तरीका होना चाहिए।

क्या मैं यूआरआई में पैरामीटर को लिंग पैरामीटर को स्पष्ट रूप से बांध सकता हूं और अगर इसे सबमिट नहीं किया गया तो अपवाद फेंक सकता है?

मैंने टाइप कन्वर्टर्स के बारे में पढ़ा है लेकिन मुझे यूआरआई स्ट्रिंग पर काम करना होगा और मुझे लगता है कि मुझे बहुत सारी कार्यक्षमता लागू करनी होगी जो वेबएपी स्पष्ट रूप से पहले से ही है।

कृपया ध्यान रखें कि मुझे यूआरआई पर काम करना है और अनुरोध निकाय का उपयोग नहीं कर सकता है।

उत्तर

4

इस तरह enum nullable बनाने के बारे में कैसे?

public class Demographics 
{ 
    public Gender? Gender { get; set; } 
} 

कार्रवाई विधि के अंदर, तुम सिर्फ अगर demographics.Gender रिक्त है या नहीं देख सकते हैं।

1

वेबएपीआई में data annotations के माध्यम से एक सत्यापन ढांचा शामिल है। ,

public class Demographics 
{ 
    [Required] 
    public Gender Gender { get; set; } 
} 

फिर नियंत्रक या [ValidateModel] विशेषता के साथ नियंत्रक विधि सत्यापन के लिए मजबूर करने का प्रतीक (अन्य तरीकों के लिए मजबूर करने के बारे में पढ़ा: यह आपको चिह्नित करने के लिए जनसांख्यिकी में लिंग संपत्ति [आवश्यक] के रूप में वस्तु की अनुमति देता है यह, उदाहरण के लिएविश्व स्तर पर: model validation):

{"Message":"The request is invalid.","ModelState":{"Gender":["The Gender field is required."]}} 

अमान्य मान नियंत्रित किया जाता है:

[HttpGet] 
[ValidateModel] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

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

{"Message":"The request is invalid.","ModelState":{"Gender":["The value 'Foo' is not valid for Gender."]}} 
संबंधित मुद्दे