2012-03-30 5 views
7

Let कहते हैं कि मैं MVC 4 जाल एपीआई नियंत्रक में दो विधियों है:URL पैरामीटर

public IQueryable<A> Get() {} 

और

public A Get(int id) {} 

और निम्न मार्ग:

routes.MapHttpRoute(
    name: "Default", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

यह उम्मीद के रूप में काम करता है। एक एक और पैरामीटर, जैसे जोड़ना:

GET /controller?p=100 

या

GET /controller/1?p=100 

संदेश के साथ "कोई कार्रवाई नहीं मिला था:

public IQueryable<A> Get(int p) {} 

public A Get(int id, int p) {} 

स्थिति जब MVC निम्नलिखित अनुरोध के लिए रिटर्न 404 की ओर जाता है नियंत्रक 'नियंत्रक' पर जो अनुरोध से मेल खाता है "

मुझे उम्मीद है कि यूआरएल पैराम मुद्दों के बिना एमवीसी द्वारा टायरों को तारित किया जाना चाहिए, लेकिन यह सच नहीं है। क्या यह एक बग या मेरी गलतफहमी है कि कैसे एमवीसी मानचित्र कार्रवाई करने का अनुरोध करते हैं?

+0

[यहाँ] (http काम नहीं किया: // मंचों। asp.net/t/1774984.aspx/2/10) एक ही समस्या का वर्णन किया गया है लेकिन इस निष्कर्ष के साथ यह व्यवहार –

+0

पीएस की अपेक्षा नहीं है। यूआरएल में एक ही समस्या के कारण ओडीएटी सिंटैक्स काम नहीं करेगा अगर HTTP वर्ब में मैप किए गए एक से अधिक विधि हैं। –

+0

क्या आप अपना वास्तविक मार्ग और अपने नियंत्रक में सभी विधियों और हस्ताक्षर दिखा सकते हैं? –

उत्तर

8

यदि आप सोचते हैं कि आप क्या करने का प्रयास कर रहे हैं और जिस मार्ग का आप प्रयास कर रहे हैं, तो आपको पता चलेगा कि आपके मामले में दूसरा पैरामीटर "पी", वैकल्पिक पैरामीटर के रूप में भी चिह्नित किया जाना चाहिए।

है कि अपने मार्ग इतना की तरह परिभाषित किया जाना चाहिए:

routes.MapHttpRoute(
name: "Default", 
routeTemplate: "{controller}/{id}/{p}", 
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional }); 

बार जब आप इस, यूआरएल करना

/नियंत्रक पी = 100 अपने

public IQueryable<A> Get(int p) {} 

करने के लिए नक्शे होगा? विधि और एक यूआरएल जैसा:

/controller/1?p=100 

, अपने

public A Get(int id, int p) {} 

विधि करने के लिए नक्शे, जैसा कि आप उम्मीद करते हैं।

तो अपने प्रश्नों के उत्तर देने के लिए .... नहीं, यह एक बग नहीं है बल्कि डिजाइन/अपेक्षित है।

+0

यह ठीक है, लेकिन जहां तक ​​मुझे याद है कि कुछ समय पहले एमवीसी 2 का उपयोग किया जाता था, सामान्य तरीका मार्ग को छूए बिना विधि पैरामीटर निर्दिष्ट करना है। उदाहरण: [यहां] (http://stackoverflow.com/questions/627838/asp-net-mvc-getting-querystring-values) - और एमवीसी को पैरामीटर इनपुट करने के लिए यूआरएल के क्वेरी भाग के तारों के लिए नौकरी करना चाहिए। –

+0

@pborovik, जैसा कि मैंने पहले कहा था, "अगर आप इसके बारे में सोचते हैं", तो आपको पता चलेगा कि आपको यह निर्दिष्ट करने की आवश्यकता है कि दूसरा पैरामीटर भी वैकल्पिक है। आप नहीं कह सकते कि पहला पैरामीटर वैकल्पिक है लेकिन दूसरा नहीं है। यह सिर्फ समझ में नहीं आता है। –

+0

@pborovik अगर आपने इन विधियों के लिए "अधिभार" परिभाषित किया है, तो एपीआई नियंत्रक दूसरे पैरामीटर प्रदान नहीं किए जाने पर उन विधियों को प्रेषित करेगा। लेकिन आपके मामले में आपके पास केवल दो विधियां हैं, इसलिए प्रेषक किसी भी क्रिया विधि को प्रेषित नहीं कर सकता है। –

0

WebApiConfig में अतिरिक्त मार्गों के लिए httproute

RouteParameter.Optional करने के लिए नए चूक जोड़ने के लिए मुझे

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}/{voucher}", 
      defaults: new { id = RouteParameter.Optional ,defaultroute1="",defaultroute2=""} 
     );