GST और POST ASP.NET MVC में एक ही कंट्रोलर एक्शन के लिए


90

मैं दोनों के साथ ही पोस्ट हो जाता है एक भी कार्रवाई का जवाब देना चाहते हैं। मैंने निम्नलिखित कोशिश की

[HttpGet]
[HttpPost]
public ActionResult SignIn()

यह काम नहीं लगता था। कोई सुझाव ?


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

ASP.NET MVC2 और VisualStudio 2010 में ओपी का उदाहरण ("[AcceptVerbs (HttpVerbs.Get)]]", आदि) के साथ संकलन त्रुटि देता है: "डुप्लीकेट 'AcceptVerbs' विशेषता"।
डेवड जूल

4
@ क्या आप कर रहे हैं [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]या [AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]? मैं उन विशेषताओं के बारे में कुछ नहीं जानता, लेकिन अगर आप दूसरा काम कर रहे हैं तो हो सकता है कि आपको वह त्रुटि मिल रही हो।
जारेड

जवाबों:


134

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

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

Msdn पर अधिक ।


3
हां, लेकिन क्या होगा यदि विधि मापदंडों का उपयोग करती है (उदाहरण के लिए साइन इन करें (सिंगइनपराम पैरामीटर) ... GET के लिए, उन्हें URI से लिया गया है (इसलिए [FromUri] निर्दिष्ट किया जाना है) और POST के लिए उन्हें शरीर से लिया गया है (इसलिए [] FromBody] निर्दिष्ट किया जाना है)?
michal.jakubeczy

64

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

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

अपनी आवश्यकता के आधार पर आप HttpCethtext.Request.HttpMethod मान पर काम करके HttpMethod के आधार पर अलग-अलग तर्क कर सकते हैं।


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

1
@ जेबीटॉन आमतौर पर मेरे पास एक जीईटी विधि होती है जिसमें सिर्फ क्वेरी स्ट्रिंग परम SignIn(Guid? UserId)और पोस्ट मॉडल होते हैं SignIn(SomeVM vm)और दोनों एक साझा निजी पद्धति को कहते हैं SignInHandleGetPost(...)... जो शायद वीएम को लेता है कि जीईटी विधि को वैकल्पिक करना चाहिए, या वैकल्पिक params, या आप जो भी करना चाहते हैं। पुन: प्रयोज्य / साझा कोड को फिर से दर्शाने के लिए।
एरोनल्स

2
@JBeckton मैंने अभी इसे ASP.NET MVC 4.6.1 नमूना परियोजना के साथ विधि के साथ आजमाया AccountController.Login(String returnUrl, LoginViewModel model)और यह ठीक काम करता है। modelGET पर शून्य है और POST पर गैर-शून्य है। हालाँकि, इसे अधिक [ValidateForgeryToken]करने की आवश्यकता है क्योंकि ValidateForgeryTokenGET अनुरोधों पर एक अपवाद फेंकता है।
दाई

0
[HttpGet]
public ActionResult SignIn()
{
}

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

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

फिर आपको कुर्ते के जवाब का पालन करने की आवश्यकता है। कोई विशेषता दोनों को नहीं संभालेगी। यदि आप विभिन्न कार्यों के लिए POST अनुरोध करने का प्रयास कर रहे हैं, तो यह संभव नहीं है। आपके द्वारा की जा रही स्विचिंग को करने के लिए आपकी क्रिया को पूरा करना होगा।
जेरेमी बी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.