2015-09-29 3 views
6

मैं एक नियंत्रक कार्रवाई विधि है कि काम करता है जब यह इस तरह दिखता है:एएसपी MVC नियंत्रक कार्रवाई '404 नहीं मिला' त्रुटि के साथ सजाया [HttpPost]

public ActionResult testMethod(int id) 
{ 
    //do something... 
    //return something... 
    return View(); 
} 

लेकिन जब मैं यह दर्शाते हैं कि यह होना चाहिए एक " पोस्ट "विधि, मैं एक '404 नहीं मिला त्रुटि' मिलती है:

[HttpPost] 
public ActionResult testMethod(int id) 
{ 
    //do something... 
    //return something... 
    return View(); 
} 

मैं एक ही नियंत्रक में अन्य नियंत्रक कार्रवाई तरीकों - दोनों पोस्ट और मिलता है, और वे ठीक काम करते हैं। लेकिन यह कोई नहीं करता है? क्या चल रहा है? (मुझे यकीन है कि मुझे कुछ स्पष्ट याद आ रहा है ...)

अद्यतन: एक AJAX कॉल नियंत्रक विधि का अनुरोध करता है: var id = 1;

$.ajax({ 
    url: '/indices/testMethod/', 
    data: id, 
    type: 'POST', 
    success: function (data) { 
     //Do something 
    } 
}); 

मैंने पोस्टमैन के साथ विधि का परीक्षण करने का भी प्रयास किया है, यह सुनिश्चित कर लें कि एक POST अनुरोध भेजा गया हो।

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

फिडलर में, मैं देख सकता हूं कि वास्तव में एक जीईटी अनुरोध किया जा रहा है, भले ही मैं AJAX कॉल में एक POST अनुरोध निर्दिष्ट करता हूं, इसलिए अब मुझे यह पता लगाना होगा कि अनुरोध GET के रूप में क्यों भेजा जा रहा है एक पद।

मैं भी एक विशेषता मार्ग विवरण सहित करने की कोशिश की और यह

[HttpPost] 
    [Route("indices/TestMethod/{id:int}")] 
    public ActionResult TestMethod(int id) 

की तरह है और किसी दूसरे यूआरएल के साथ ajax कॉल करने की कोशिश की:

$.ajax({ 
    url: '/indices/TestMethod/1', 
    data: id, 
    type: 'POST', 
    success: function (data) { 
     var tr = 123; 
     var yr = data; 
     //Do something 
    } 
}); 

विशेषता के साथ पर मार्ग, और में पैरामीटर मूल्य यूआरएल, मैं फिडलर में देखता हूं कि पहले एक पोस्ट अनुरोध होता है, जो 301 स्थिति त्रुटि प्राप्त करता है, लेकिन फिर एक जीईटी अनुरोध भी बनाया जाता है, जो 404 त्रुटि प्राप्त करता है।

अद्यतन 3: अधिक जांच करने के बाद मैं पर्याप्त रूप से नीचे समस्या परिभाषा संकुचित है कि यह समझ में बनाया एक नया सवाल है, यहाँ पाया जा सकता है खोलने के लिए: ASP MVC jQuery $.ajax POST request does not call controller method, but works in "fresh" MVC project

मुद्दा सामग्री सुरक्षा नीति की वजह से किया जा रहा है सेटिंग्स जो इस परियोजना के लिए सक्रिय थे।

+0

आप इस कार्रवाई से संपर्क करने का प्रयास कैसे करते हैं? – Robert

+4

क्या आप सुनिश्चित हैं कि अनुरोध कार्रवाई के लिए पोस्ट कर रहा है, कुछ अन्य क्रिया नहीं? फिडलर स्थापित करें और अनुरोध डेटा की जांच करें। – asawyer

+0

ने कुछ अतिरिक्त जानकारी जोड़ दी है - जहां तक ​​मुझे पता है, एक POST अनुरोध भेजा जाता है, लेकिन यह नियंत्रक तक कभी नहीं पहुंचता क्योंकि मुझे 404 त्रुटि मिलती है। –

उत्तर

0

आपको FromBody-int param1 -parameter में सबमिट करने की आवश्यकता हो सकती है क्योंकि यह एक साधारण प्रकार है? अधिक जानकारी के लिए here देखें।

अन्यथा /indices/testMethod/{param1} प्रारूप में एक मार्ग अपेक्षित है (यानी पैरा को यूआरएल में होना आवश्यक है, भले ही यह पोस्ट-अनुरोध है)। यह मार्ग परिभाषित नहीं किया जा सकता है, यानी आपके global.asax.cs में। उदाहरण के लिए आप /indices/testMethod/1 पर पोस्ट-अनुरोध करने का प्रयास कर सकते हैं। बस कोशिश करने के लिए कि यह वास्तव में एक रूटिंग मुद्दा है?

यदि आपको अपने रूटिंग के साथ समस्याएं हैं, तो आप Attribute Routing का उपयोग करके अपनी विधि के लिए एक विशिष्ट मार्ग परिभाषित कर सकते हैं। कम से कम परीक्षण/विकास के लिए यह देखना/समझना आसान बनाता है कि वास्तव में आपकी विधि के लिए कौन सा मार्ग परिभाषित किया गया है।

को कम करने के लिए कुछ अतिरिक्त प्रश्न है, क्या यह वास्तव में हो सकता है:

  • आप किस प्रारूप dataGoesHere है -object करता है?
  • पोस्ट-विधियों का काम कैसा दिखता है? उनके पैरामीटर क्या डेटाटाइप है? संदर्भ- या मूल्य-प्रकार?
  • आप कौन से मार्ग पंजीकृत करते हैं (यानी global.asax.cs में)?

अद्यतन

मैं निम्नलिखित की कोशिश करेंगे:

परिभाषित नियंत्रक विधि इस तरह:

[HttpPost] 
[Route("indices/TestMethod/")] 
public ActionResult TestMethod([FromBody] int id) 

परिभाषित इस तरह कार्रवाई कॉल:

$.ajax({ 
    url: '/indices/TestMethod/', 
    data: id, // alternatively try: {id: id} 
    type: 'POST', 
    success: function (data) { } 
}); 

या तो id को एक साधारण मान के रूप में पास करने का प्रयास करें या id -property (ऊपर टिप्पणी देखें) के साथ किसी ऑब्जेक्ट को पास करने का प्रयास करें।

+1

यदि यह मामला था, पैरामीटर खाली होगा (एक संदर्भ अगर शून्य, 0 अगर एक int)। ओपी * एक्शन * बिल्कुल कॉल नहीं कर सकता है।यह एक लापता पैरामीटर के बारे में नहीं है –

+0

@ पानागियोटिस कानावोस: हम कैसे जानते हैं कि लेखक किस यूआरएल का उल्लेख कर रहे विभिन्न परिदृश्यों का प्रयास कर रहा है? और हम कैसे जानते हैं, वास्तव में कौन से मार्ग परिभाषित किए जाते हैं? यदि 'param1'' UrlParameter.Optional' नहीं है, तो मुझे लगता है कि विधि के लिए मार्ग मेल नहीं खाता है जब '/ indices/testMethod /' (आगे के बिना पैरामीटर) कहा जाता है। – PzYon

+0

@PzYon: आप जवाब सही है, [FromBody] विधि पहचान का एक अनिवार्य हिस्सा है। –

0

param1 से id बदलने का प्रयास करें और देखें कि यह काम करता है या नहीं। यह बेवकूफ लग सकता है लेकिन वास्तव में मैंने खुद से पहले अपनी समस्या का अनुभव किया है और समस्या हल हो गई है।

अन्य समस्या जो मैं सोच सकता था वह है कि आपके ऐप में, testMethod का पथ /Indices/TestMethod अपरकेस वर्णों के साथ है। और जब आप /indices/testMethod/ का अनुरोध करते हैं तो कुछ रीडायरेक्ट हो सकते हैं जिसके परिणामस्वरूप GET अनुरोध होता है।

अपने AJAX कॉल में url को बदलने का प्रयास करें या मार्ग नाम सेट करने के लिए [Route()] विशेषता जोड़ने का प्रयास करें।

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