2010-07-12 19 views
75

में एक ही नियंत्रक कार्रवाई के लिए प्राप्त करें और पोस्ट करें मैं गेट्स और पोस्ट दोनों के लिए एक ही कार्रवाई का जवाब देना चाहता हूं। मैंने निम्नलिखितएएसपी.नेट एमवीसी

[HttpGet] 
[HttpPost] 
public ActionResult SignIn() 

ऐसा करने की प्रतीत नहीं की। कोई सुझाव ?

+0

क्या काम नहीं करता है, और यह कैसे विफल हो जाता है? –

+0

समस्या की व्याख्या करने के लिए: कार्रवाई को अनदेखा किया जाता है। प्रत्येक विशेषता अन्य सभी अनुरोध विधियों को बहिष्कृत करेगी, इसलिए कार्रवाई किसी भी अनुरोध विधियों को स्वीकार नहीं करती है। – Guffa

+4

EvilRyry का जवाब क्यों स्वीकार नहीं किया गया था? यह मेरे लिए चाल है। –

उत्तर

0
[HttpGet] 
public ActionResult SignIn() 
{ 
} 

[HttpPost] 
public ActionResult SignIn(FormCollection form) 
{ 
} 
+0

यह वह नहीं है जिसे मैं ढूंढ रहा हूं, यह कि डिफ़ॉल्ट अधिभार के माध्यम से जीईटी और पोस्ट के लिए अलग-अलग तरीकों के डिफ़ॉल्ट एमवीसी कार्यान्वयन का है। मैं एमवीसी के लिए नया नहीं हूं, मैं फॉर्म संग्रह के लिए मानक POST कार्रवाई के अतिरिक्त GET कार्रवाई को कुछ POST ईवेंट का भी जवाब देने की कोशिश कर रहा हूं। – Cranialsurge

+0

फिर आपको कुर्ट्स के उत्तर का पालन करने की आवश्यकता है। कोई विशेषता दोनों को संभालने में सक्षम नहीं होगी। यदि आप विभिन्न कार्यों पर POST अनुरोध करने का प्रयास कर रहे हैं, तो यह संभव नहीं है। आपकी कार्रवाई को उस स्विचिंग को करना होगा जिसे आप ढूंढ रहे हैं। –

56

क्रिया प्रतिक्रिया दोनों हो जाता है और डिफ़ॉल्ट रूप से पोस्ट करने के लिए है, तो आप कुछ भी निर्दिष्ट करने के लिए की जरूरत नहीं है: अपनी जरूरत पर निर्भर करता है

public ActionResult SignIn() 
{ 
    //how'd we get here? 
    string method = HttpContext.Request.HttpMethod; 
    return View(); 
} 

आप अभी भी ऑपरेटिंग द्वारा HttpMethod पर अलग तर्क के आधार प्रदर्शन कर सकता है HttpContext.Request.HttpMethod मान पर।

+5

यह तब तक ठीक है जब तक आप दृश्य मॉडल का उपयोग करने का प्रयास नहीं करते! पोस्ट एक्शन में आप आमतौर पर व्यूमोडेल में गुजरेंगे, मैंने वैकल्पिक पैरामीटर का उपयोग करने का प्रयास किया है और इसे शून्य पर डिफॉल्ट किया है लेकिन यह काम नहीं करता है। – JBeckton

+1

@JBeckton आमतौर पर मेरे पास एक GET विधि है जिसमें केवल क्वेरी स्ट्रिंग पैरा 'साइनइन (Guid? UserId) है और POST मॉडल' साइनइन (कुछVM vm) 'मॉडल है और दोनों साझा निजी विधि' SignInHandleGetPost (...) ' ... जो शायद वीएम लेता है कि जीईटी विधि को आरंभ करना चाहिए, या वैकल्पिक पैराम, या जो भी आप रूजबल/साझा कोड को दोबारा करने के लिए करना चाहते हैं। – AaronLS

+0

@ जेबीकटन मैंने अभी एएसपी.नेट एमवीसी 4.6.1 नमूना प्रोजेक्ट के साथ इसे 'AccountController.Login (स्ट्रिंग रिटर्न यूआरएल, लॉग इन व्यू मॉडेल मॉडल) विधि के साथ आजमाया है और यह ठीक काम करता है। 'मॉडल' जीईटी पर शून्य है और पोस्ट पर गैर-शून्य है। हालांकि '[ValidateForgeryToken] 'को ओवरराइड करने की आवश्यकता है क्योंकि' ValidateForgeryToken' GET अनुरोधों पर अपवाद फेंकता है। – Dai

111

AcceptVerbs विशेषता का उपयोग करना संभव है। यह थोड़ा और अधिक verbose लेकिन अधिक लचीला है।

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)] 
public ActionResult SignIn() 
{ 
} 

msdn पर अधिक।

+0

हां, लेकिन अगर विधि पैरामीटर का उपयोग करती है (उदाहरण के लिए साइनइन (सिंगइन पैराम्स पैरामीटर) ... जीईटी के लिए, उन्हें यूआरआई से लिया जाता है (इसलिए [FromUri] को निर्दिष्ट किया जाना चाहिए) और पोस्ट के लिए उन्हें शरीर से लिया जाता है (इसलिए [FromBody] को निर्दिष्ट किया जाना है)? – jabko87

+0

यह स्वीकार्य उत्तर होना चाहिए। –

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