2012-09-27 24 views
24

पर आधारित रूटिंग मैं अपने एमवीसी 4 वेबएपीआई प्रोजेक्ट में रूटिंग कॉन्फ़िगर करने की कोशिश कर रहा हूं।क्वेरी स्ट्रिंग पैरामीटर नाम

मैं उनके नाम या तो जैसे उनके प्रकार के आधार पर उत्पादों के लिए खोज करने के लिए सक्षम होना चाहते हैं:

/api/products?name=WidgetX - WidgetX /api/products?type=gadget नामित सभी उत्पादों रिटर्न - प्रकार गैजेट की सभी उत्पादों

रास्ते हैं रिटर्न इस तरह से कॉन्फ़िगर किया गया:

config.Routes.MapHttpRoute(
    name: "Get by name", 
    routeTemplate: "api/products/{name}", 
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByName", name = string.Empty } 
); 

config.Routes.MapHttpRoute(
    name: "Get by type", 
    routeTemplate: "api/products/{type}", 
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByType", type = string.Empty } 
); 

समस्या यह है कि क्वेरी स्ट्रिंग पैरामीटर के नाम पर ध्यान नहीं दिया जा करने के लिए इतना पहले मार्ग हमेशा उपयोग किया जाता है, भले ही लगता है क्वेरी स्ट्रिंग पैरामीटर का नाम। इसे सही करने के लिए मैं अपने मार्ग को कैसे संशोधित कर सकता हूं?

उत्तर

30

आप की जरूरत क्या है क्योंकि क्वेरी स्ट्रिंग मार्ग पैरामीटर के रूप में इस्तेमाल नहीं किया है सिर्फ एक ही रास्ता नीचे है:

GetProductsByName(string name) 
{} 

GetProductsByType(string type) 
{} 

रूटिंग:

config.Routes.MapHttpRoute(
    name: "Get Products", 
    routeTemplate: "api/products", 
    defaults: new { controller = "ProductSearchApi" } 
); 

और, उसके बाद दो तरीकों से नीचे की तरह परिभाषित तंत्र स्मार्ट क्वेरी स्ट्रिंग के नाम पर आधारित आपकी सही क्रिया के लिए अपने यूआरएल को रूट करने के लिए पर्याप्त है, चाहे इनपुट पैरामीटर के साथ समान है। बेशक उपसर्ग के साथ सभी तरीकों Get

हैं पर आप इस पढ़ने के लिए आवश्यकता हो सकती है: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

0

के लिए RouteParameter.Optional

+0

RouteParameter मेरे जैसे/उत्पादों/एबीसी जो निश्चित रूप से की आवश्यकता को पूरा नहीं होता यूआरएल का उपयोग होगा। मुझे क्वेरी स्ट्रिंग पैरामीटर का उपयोग करने में सक्षम होना चाहिए। – rickythefox

4

आप मार्ग में अपने क्वेरी पैरामीटर शामिल करने के लिए की जरूरत नहीं है string.Empty बदलने का प्रयास करें। सिर्फ एक ही सरल मार्ग नक्शा होना चाहिए अपने ApiControllers के सभी पर HTTP विधियों को कवर करने के:

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

केवल समय आप मार्गों समायोजित करने की आवश्यकता है अगर आप वास्तविक पथ में एक पैरामीटर स्थानांतरित करने के लिए, चाहते हैं आप जो ऐसा प्रतीत नहीं होता है। फिर दो क्षेत्रों के आधार पर खोज अपने GET http विधि करने के लिए होगा:

public IEnumerable<Product> Get(string name, string type){ 
    //..your code will have to deal with nulls of each parameter 
} 

आप स्पष्ट रूप से एक समय में एक क्षेत्र से खोज करने के लिए तो आप विभिन्न प्रयोजनों के लिए अलग अलग नियंत्रकों के उपयोग के बारे में सोचना चाहिए चाहते हैं। आईई, SearchProductByTypeController जिसमें एक Get(string type) विधि है। मार्ग तब/api/SearchProductByTypeController होगा? प्रकार = गैजेट

+0

धन्यवाद, कभी-कभी समस्या कोड में नहीं बल्कि वास्तुकला में है। ;) – rickythefox

+1

'SearchProductByTypeController' किस प्रकार का संसाधन है? : पी –

0

क्या आप सुनिश्चित हैं कि नियंत्रक ठीक हैं? मेरा मतलब है, पैराम्स का नाम।

public string GetProductsByName(string name) 
    { 
     return "Requested name: " + name; 
    } 

    public string GetProductsByType(string type) 
    { 
     return "Requested type: " + type; 
    } 
संबंधित मुद्दे