2011-06-14 18 views
23

एक आरईएसटी आधारित एपीआई के लिए एक GET/PUT/DELETE/POST के लिए एक ही यूआरएल का उपयोग करना चाहता था, लेकिन जब क्रियाओं के बारे में एकमात्र चीज यह है कि कौन सी HTTP क्रियाएं स्वीकार करती हैं, तो यह उन्हें डुप्लिकेट मानती है!स्वीकृत HTTP क्रियाओं के आधार पर मैं एएसपी.नेट एमवीसी क्रियाओं को कैसे अधिभारित कर सकता हूं?

"टाइप पहले से ही पैरामीटर प्रकारों के साथ 'इंडेक्स' नामक एक सदस्य को परिभाषित करता है।"

जिस पर मैंने कहा, तो क्या? यह केवल प्राप्त करता है, यह केवल पोस्ट स्वीकार करता है ... सही सह-अस्तित्व में सक्षम होना चाहिए?

कैसे?

+1

ऑफ-विषय का प्रकार, लेकिन मैं ठीक से यह FubuMVC के साथ कर रहा हूं, अगर आपको ऐसा करने की स्वतंत्रता है तो – heisenberg

उत्तर

35

यह एएसपी.नेट एमवीसी सीमा या जो भी नहीं है। यह .NET है और कक्षाएं कैसे काम करती हैं: इससे कोई फर्क नहीं पड़ता कि आप कितनी मेहनत करते हैं, आपके पास एक ही कक्षा के समान नाम के साथ दो विधियां नहीं हो सकतीं जो समान पैरामीटर लेती हैं। एक असली शोकहारा आवेदन विभिन्न क्रिया के रूप में अच्छी तरह से विभिन्न मापदंडों ले जाएगा में

[HttpGet] 
[ActionName("Foo")] 
public ActionResult GetMe() 
{ 
    ... 
} 

[HttpPut] 
[ActionName("Foo")] 
public ActionResult PutMe() 
{ 
    ... 
} 

[HttpDelete] 
[ActionName("Foo")] 
public ActionResult DeleteMe() 
{ 
    ... 
} 

[HttpPost] 
[ActionName("Foo")] 
public ActionResult PostMe() 
{ 
    ... 
} 
बेशक

है, तो आप शायद ही कभी ऐसी स्थितियों होगा: आप [ActionName] विशेषता का उपयोग धोखा हो सकता है।

आप अपने मार्गों को व्यवस्थित करने के तरीके के बारे में कुछ विचारों के लिए SimplyRestful पर एक नज़र डाल सकते हैं।

+0

"अलग-अलग क्रियाएं अलग-अलग पैरामीटर भी लेती हैं" क्या आप विस्तृत कर सकते हैं? मैंने सोचा/उपयोगकर्ता/[आईडी] एक अच्छा यूआरएल था और जीईटी, पोस्ट, पुट स्वीकार कर सकता है, सब कुछ ठीक कर सकता है ... केवल अंतर ही अनुरोध की सामग्री होगी, है ना? – BigOmega

+0

@Ryan, नहीं, एक पोस्ट जो एक POST अनुरोध का जवाब देगा, वह दृश्य मॉडल है जिसे आप एक्शन तर्क के रूप में बना रहे हैं: '[HttpPost] public ActionResult Foo (AModelToCreate मॉडल) {...} 'निश्चित रूप से कौन सा होगा जीईटी कार्रवाई से अलग जो केवल 'आईडी' की आवश्यकता होगी। –

+0

ओह, मुझे उसमें पढ़ने की ज़रूरत है, मैंने कभी भी उपयोग ऑब्जेक्ट से चर खींच लिया है ... – BigOmega

8

जबकि एएसपी.नेट एमवीसी आपको एक ही नाम के साथ दो क्रिया रखने की अनुमति देगा, .NET आपको एक ही हस्ताक्षर के साथ दो विधियों की अनुमति नहीं देगा - यानी वही नाम और पैरामीटर।

आपको एएसपी.नेट एमवीसी को बताने के लिए ActionName विशेषता का अलग-अलग तरीकों का उपयोग करने की आवश्यकता होगी कि वे वास्तव में एक ही क्रिया हैं।

कहा, यदि आप एक GET और एक POST के बारे में बात कर रहे हैं, इस समस्या होने की संभावना दूर जाना होगा, के रूप में POST कार्रवाई GET की तुलना में अधिक मापदंडों लेने के लिए और इसलिए अलग पहचाना हो जाएगा।

तो, आप की जरूरत है या तो:

[HttpGet] 
public ActionResult ActionName() {...} 

[HttpPost, ActionName("ActionName")] 
public ActionResult ActionNamePost() {...} 

या:

[HttpGet] 
public ActionResult ActionName() {...} 

[HttpPost] 
public ActionResult ActionName(string aParameter) {...} 
1

एक अन्य विकल्प के लिए एक एकल विधि है कि सभी को स्वीकार करता है और HttpMethod में भेद किया और वहाँ से उचित कोड कहता है। जैसे

  string httpMethod = Request.HttpMethod.ToUpperInvariant(); 

      switch (httpMethod) 
      { 
       case "GET": 
        return GetResponse(); 

       case "POST": 
        return PostResponse(); 

       default: 
        throw new ApplicationException(string.Format("Unsupported HttpMethod {0}.", httpMethod)); 
      } 
+2

HttpMethod का चालाक उपयोग, लेकिन एसआरपी का उल्लंघन करता है। – Rap

0

आप, तरीकों एक डिफ़ॉल्ट मान के साथ एक अतिरिक्त तर्क में से एक के लिए जोड़ सिर्फ सीमा बायपास करने के लिए और निर्माण करने में सक्षम हो सकता है समाधान के लिए।

बेशक यह ध्यान रखें कि यह चीजों को करने का सबसे अनुशंसित तरीका नहीं है, और आपको अपने कोड (पैरामीटर नाम या टिप्पणियों के माध्यम से) में स्पष्ट करना होगा कि यह केवल एक अतिरिक्त तर्क है इसे बनाने के लिए, और निश्चित रूप से सुनिश्चित करें कि आपने अपने गुणों को सही तरीके से सजाया है।