रूटिंग: कार्रवाई के लिए वर्तमान अनुरोध […] निम्नलिखित कार्रवाई विधियों के बीच अस्पष्ट है


100

मेरे पास एक व्यू है Browse.chtml, जहां उपयोगकर्ता एक खोज शब्द दर्ज कर सकता है, या खोज शब्द को खाली छोड़ सकता है। खोज शब्द दर्ज करते समय, मैं पृष्ठ को निर्देशित करना चाहता हूं http://localhost:62019/Gallery/Browse/{Searchterm} और जब कुछ भी दर्ज नहीं किया जाता है, तो मैं ब्राउज़र को निर्देशित करना चाहता हूं http://localhost:62019/Gallery/Browse/Start/Here

जब मैं यह कोशिश करता हूं, मुझे त्रुटि मिलती है:

नियंत्रक प्रकार 'गैलरीकंट्रोलर' पर कार्रवाई 'ब्राउज़' के लिए वर्तमान अनुरोध निम्न क्रिया विधियों के बीच अस्पष्ट है: System.Web.Mvc.ActionResult ब्राउज़ (System.String) प्रकार AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult ब्राउज़ पर (Int32, System.String) प्रकार AutoApp_MVC.Controllers.GalleryController पर

एमवीसी के साथ जो कुछ भी मैं कर रहा हूं वह पहली बार है। मुझे यकीन नहीं है कि इस बिंदु पर और क्या प्रयास करना है।

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

मेरे पास Global.asax.cs में यह भी है:

    routes.MapRoute(
         "StartBrowse",
         "Gallery/Browse/{s1}/{s2}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             s1 = UrlParameter.Optional,
             s2 = UrlParameter.Optional
         });



    routes.MapRoute(
         "ActualBrowse",
         "Gallery/Browse/{searchterm}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             searchterm=UrlParameter.Optional
         });

जवाबों:


161

आपके पास नियंत्रक पर एक ही नाम के साथ अधिकतम 2 क्रिया विधियां हो सकती हैं [HttpPost], और ऐसा करने के लिए, 1 होना चाहिए , और दूसरा होना चाहिए [HttpGet]

चूँकि आपके दोनों तरीके GET हैं, इसलिए आपको या तो एक एक्शन मेथड का नाम बदलना चाहिए या इसे अलग कंट्रोलर में ले जाना चाहिए।

यद्यपि आपके 2 ब्राउज़ तरीके वैध C # ओवरलोड हैं, MVC एक्शन विधि चयनकर्ता यह पता लगाने के लिए कौन सी विधि का पता नहीं लगा सकता है। यह विधि (या इसके विपरीत) के लिए एक मार्ग से मेल खाने की कोशिश करेगा, और यह बीजगणित दृढ़ता से टाइप नहीं किया गया है।

आप विभिन्न कार्य विधियों की ओर इशारा करते हुए कस्टम मार्गों का उपयोग करके जो चाहें प्राप्त कर सकते हैं:

... Global.asax में

routes.MapRoute( // this route must be declared first, before the one below it
     "StartBrowse",
     "Gallery/Browse/Start/Here",
     new
     {
         controller = "Gallery",
         action = "StartBrowse",
     });

routes.MapRoute(
     "ActualBrowse",
     "Gallery/Browse/{searchterm}",
     new
     {
         controller = "Gallery",
         action = "Browse",
         searchterm = UrlParameter.Optional
     });

... और नियंत्रक में ...

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult StartBrowse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

आप नियंत्रक में समान नाम की क्रिया विधियों को रखने में सक्षम हो सकते हैं , [ActionName]इसे अलग करने के लिए एक विशेषता को लागू करके । उपरोक्त के रूप में एक ही Global.asax का उपयोग करते हुए, आपका नियंत्रक फिर इस तरह दिखेगा:

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

[ActionName("StartBrowse")]
public ActionResult Browse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

तो, मुझे आपके उदाहरण में एक नया दृश्य बनाने की आवश्यकता होगी? ऐसा लगता है कि यह ActionName टैग का उपयोग करने में मदद नहीं करता है, क्योंकि मुझे लगता है कि केवल सभी एक्शन विधियों (दोनों को एक ही समय में रखने में असमर्थ) का नाम बदलने के लिए काम करता है। यह जानना अच्छा है कि एमवीसी कैसे काम करता है। धन्यवाद।
डेव

6
नहीं, आपको कोई नया विचार बनाने की आवश्यकता नहीं है। आप अभी भी दोनों कार्यों के लिए एक ही दृश्य का पुन: उपयोग कर सकते हैं। बस पहले तर्क के रूप में दृश्य नाम पास करेंreturn View("Browse", summaries);
danludwig

क्या भविष्य के कुछ रिलीज में ओवरलोडिंग को शामिल किया जाएगा? परिवर्तन करने के लिए मार्गों को संशोधित करना अतिरिक्त कार्य है और अतिरिक्त रखरखाव की आवश्यकता होती है।
ओल्ड गीजर

@OldGeezer शायद नहीं है, क्योंकि वहाँ एक वर्कअराउंड (ऊपर) है, और क्योंकि एक नियंत्रक में अतिभारित एक्शन तरीके आम तौर पर एक अच्छा विचार नहीं हैं।
danludwig

4

मुझे नहीं पता कि जब यह प्रश्न पूछा गया था कि यह समाधान उपलब्ध है, लेकिन आप इसका उपयोग कर सकते हैं:

Request.QueryString["key"]

तो यह आपकी समस्या के लिए ठीक काम करना चाहिए:

[HttpGet]
public ActionResult Browse()
{
    if( Request.QueryString["id"] != null )        
        var summaries = /* search using id as search term */
    else /*assuming you don't have any more option*/
        var summaries = /* default list when nothing entered */

    return View(summaries);
} 

2

डिफ़ॉल्ट मार्ग से पहले RouteConfig.cs में निम्न कोड जोड़ें

routes.MapMvcAttributeRoutes();

और नियंत्रक में मार्ग विशेषताएँ जोड़ें:

    [Route("Cars/deteals/{id:int}")]
    public ContentResult deteals(int id)
    {
        return Content("<b>Cars ID Is " + id + "</b>");
    }

    [Route("Cars/deteals/{name}")]
    public  ContentResult deteals(string name)
    {
        return Content("<b>Car name Is " + name + "</b>");

    }

1

मुझे लगता है कि जो बिंदु बनाया जा रहा है, वह यह है कि आपको अनुरोध वर्ग का उपयोग करते हुए पैरामीटरों के लिए स्पष्ट रूप से परीक्षण करने की आवश्यकता नहीं है।

MVC आपके लिए मैपिंग करता है (जब तक कि आपने अपने MVC मार्गों में गंभीर बदलाव नहीं किए हैं)।

इस प्रकार एक एक्शनलिंक पथ

/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/

परिभाषित पैरामीटर के साथ आपके (सतह) नियंत्रक के लिए स्वचालित रूप से उपलब्ध होगा:

public ActionResult Logout(string DestinationUrl)

MVC काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.