आप ASP.NET MVC में नियंत्रक विधियों को अधिभारित कर सकते हैं?


327

मैं यह देखने के लिए उत्सुक हूं कि क्या आप ASP.NET MVC में नियंत्रक विधियों को अधिभारित कर सकते हैं। जब भी मैं कोशिश करता हूं, मुझे नीचे त्रुटि मिलती है। दो तरीके अलग-अलग तर्क को स्वीकार करते हैं। क्या यह कुछ ऐसा है जो नहीं किया जा सकता है?

नियंत्रक प्रकार 'MyController' पर कार्रवाई 'MyMethod' के लिए वर्तमान अनुरोध निम्नलिखित कार्रवाई विधियों के बीच अस्पष्ट है:



10

10
और उसी के लिए एमवीसी 6
इमाद

7
और एमवीसी कोर 1.1 के लिए समान
kall2sollies

7
और एमवीसी कोर 2.0 के लिए वही
गिलहर्मे

जवाबों:


201

यदि आप अपने कोड को ओवरलोडिंग करना चाहते हैं, तो आप विशेषता का उपयोग कर सकते हैं।

[ActionName("MyOverloadedName")]

लेकिन, आपको उसी http विधि के लिए एक अलग कार्रवाई नाम का उपयोग करना होगा (जैसा कि अन्य ने कहा है)। तो यह उस बिंदु पर सिर्फ शब्दार्थ है। आप अपने कोड या अपनी विशेषता में नाम होगा?

फिल का इससे संबंधित एक लेख है: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx


5
इसका उपयोग करने और आपकी कार्रवाई को ओवरलोड करने का मुख्य दोष यह है कि इसे अब एक ही दृश्य फ़ाइल द्वारा प्रदान नहीं किया जा सकता है।
जेफ मार्टिन

66
वास्तव में, यह अभी भी उसी दृश्य फ़ाइल को प्रस्तुत कर सकता है। आपको केवल आँख बंद करके कॉल करने के बजाय दृश्य का नाम निर्दिष्ट करना होगा return View();। उदाहरण के लिए return View("MyOverloadedName");:।
एमान

1
@JD लेकिन Microsoft कहता है .. नियंत्रक क्रिया के रूप में उपयोग की जाने वाली एक विधि अतिभारित नहीं की जा सकती है .. आप इसे यहाँ देख सकते हैं .. asp.net/mvc/tutorials/controllers-and-rout/…
himanshupareek66

@Eamann नाइस, मैं हमेशा अब तक देखने के लिए पूरे रास्ते को परिभाषित कर रहा था
अलेक्जेंडर डर्क

69

हाँ। मैं प्रत्येक नियंत्रक विधि के लिए HttpGet/ HttpPost(या समतुल्य AcceptVerbsविशेषता) को कुछ अलग, अर्थात, HttpGetया HttpPost, लेकिन दोनों के लिए निर्धारित करके ऐसा करने में सक्षम रहा हूँ । इस तरह यह अनुरोध के प्रकार के आधार पर बता सकता है कि किस विधि का उपयोग करना है।

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

[HttpPost]
public ActionResult Show( string userName )
{
   ...
}

मेरा एक सुझाव यह है कि, इस तरह के मामले के लिए, एक निजी कार्यान्वयन होगा जो आपके दोनों सार्वजनिक एक्शन तरीकों को डुप्लिकेट कोड से बचने के लिए भरोसा करता है।


1
MVC2 के साथ और एक भी HttpPost / HttpGet विशेषता का उपयोग कर सकते हैं
yoel halb

@ योहल हां, यदि अब आपको कई क्रियाओं का समर्थन करने की आवश्यकता नहीं है, तो इसे संभालने के लिए विहित तरीका होगा।
tvanfosson

3
REST के सिद्धांतों का उल्लंघन करने के लिए इसका दुरुपयोग न करें।
फ्रेड

1
बहुत यकीन है कि यह केवल इसलिए काम कर रहा है क्योंकि आपके Show()तरीकों में अलग-अलग हस्ताक्षर हैं। यदि और जब आपको गेट संस्करण में जानकारी भेजने की आवश्यकता होती है, तो आपके गेट और पोस्ट संस्करण एक ही हस्ताक्षर के साथ समाप्त हो जाते हैं, और आपको ActionNameइस पोस्ट में बताए गए किसी अन्य विशेषता या विशेषता की आवश्यकता होगी ।
स्कॉट फ्राले

1
@ ScottK.Fraley यह सच है। यदि उन्हें एक ही हस्ताक्षर की आवश्यकता होती है, तो आपको उन्हें अलग नाम देना होगा और आवेदन करना होगा ActionNameAttribute। व्यवहार में, मैंने शायद ही कभी ऐसा पाया हो।
तवान्फोसन

42

यहां कुछ और है जो आप कर सकते हैं ... आप एक ऐसी विधि चाहते हैं जो एक पैरामीटर के लिए सक्षम है और नहीं।

क्यों नहीं यह कोशिश ...

public ActionResult Show( string username = null )
{
   ...
}

यह मेरे लिए काम किया है ... और इस एक विधि में, आप वास्तव में यह देखने के लिए परीक्षण कर सकते हैं कि आपके पास आने वाला पैरामीटर है या नहीं।


स्ट्रिंग पर अमान्य नल योग्य सिंटैक्स को निकालने और डिफ़ॉल्ट पैरामीटर मान का उपयोग करने के लिए अद्यतन किया गया।


6
( stringअशक्त नहीं हो सकता।)
जोश एम।

23
स्ट्रिंग अशक्त हो सकती है। वास्तव में, यह पहले से ही अशक्त है, बस 'की जरूरत नहीं है?'
प्रोके

9
@ProfK - नहीं, स्ट्रिंग एक संदर्भ प्रकार है जो शून्य हो सकता है। यह "अशक्त" नहीं है। Nullable का मतलब है कि आप Nullable <T> (यानी T?) का उपयोग कर रहे हैं। जोश की बात यह है कि आप नहीं डाल सकते हैं? स्ट्रिंग के बाद क्योंकि यह मान प्रकार नहीं है, और Nullable <T> केवल मान प्रकार स्वीकार करता है।
एरिक फनकेनबस

4
मैंने इस प्रश्न पर बेतरतीब ढंग से वापस पाया और फिर महसूस किया कि मैंने ऊपर टिप्पणी पोस्ट की है। इस की कोई याद नहीं ... अजीब है! यह अभी भी सच है कि stringनहीं हो सकता है nullable; लेकिन यह हो सकता है null! किसी भी तरह मैंने ईमानदारी के बिना प्रारंभिक टिप्पणी पोस्ट की।
जोश एम।

20

नहीं, नहीं और नहीं। नीचे दिए गए नियंत्रक कोड को आज़माएं जहां हमारे पास "लोडकॉग्रफ़र" ओवरलोड है।

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

यदि आप "LoadCustomer" क्रिया को लागू करने का प्रयास करते हैं, तो आपको नीचे दिए गए चित्र में दिखाए अनुसार त्रुटि मिलेगी।

यहां छवि विवरण दर्ज करें

पॉलीमॉर्फिज्म C # प्रोग्रामिंग का एक हिस्सा है जबकि HTTP एक प्रोटोकॉल है। HTTP बहुरूपता को नहीं समझता है। HTTP अवधारणा या URL पर काम करता है और URL में केवल अद्वितीय नाम हो सकते हैं। इसलिए HTTP बहुरूपता को लागू नहीं करता है।

उसी को ठीक करने के लिए हमें "ActionName" विशेषता का उपयोग करना होगा।

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }

        [ActionName("LoadCustomerbyName")]
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

इसलिए अब यदि आप URL "ग्राहक / लोडकस्टमर" को कॉल करते हैं, तो "लोडकॉग्रूटर" कार्रवाई को आमंत्रित किया जाएगा और URL संरचना के साथ "ग्राहक / LoadCustomerByName" "LoadCustomer (string str)" का आह्वान किया जाएगा।

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

उपरोक्त उत्तर मैंने इस कोडप्रोजेक्ट लेख से लिया है -> एमवीसी एक्शन ओवरलोडिंग


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

1
@Dan लेकिन फिर हमें C # पक्ष में बहुरूपता नहीं है।
शिवप्रसाद कोईराला

आप सही हैं, ओवरलोडिंग का कोई नियंत्रक तरीका नहीं है, लेकिन इसका HTTP से कोई लेना-देना नहीं है।
चाल्की

स्पष्टीकरण के लिए धन्यवाद। +1। अधिक HTTP सोचनी चाहिए और C # नहीं। OO रणनीति के साथ कार्य करने का कोई कारण नहीं है।

15

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

यहाँ एक उदाहरण है: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

लेकिन, यह एक अच्छा विचार नहीं है।


@Cerbrus क्योंकि यह एक भयानक हैक है और अगला व्यक्ति जो आपके नियंत्रक कोड को देखता है, वह एक बहुत ही गैर-मानक दृष्टिकोण से भ्रमित होगा।
इयान मर्सर

हेह, पर्याप्त निष्पक्ष।
सेरेब्रस

14

जहाँ तक मुझे पता है कि आप विभिन्न http तरीकों का उपयोग करते समय केवल एक ही विधि कर सकते हैं।

अर्थात

[AcceptVerbs("GET")]
public ActionResult MyAction()
{

}

[AcceptVerbs("POST")]
public ActionResult MyAction(FormResult fm)
{

}

2
सजावट का ओवरलोड से कोई लेना-देना नहीं है। यह मापदंडों की सूची है जो ओवरलोडिंग की अनुमति देता है।
स्काई सैंडर्स

@SkySanders मैं असहमत हूं, पैरामीटर-आधारित ओवरलोडिंग MVC नियंत्रक विधियों में काम नहीं करता है - क्या आपको इसका एक कार्यशील उदाहरण मिला है? चीयर्स।
चाल्की

के [HttpPost]बजाय विशेषता का उपयोग करें [AcceptVerbs("POST")]
फ्रेड

9

मैंने एमवीसी 5 में एट्रिब्यूट रूटिंग की मदद से इसे हासिल किया है । निश्चित रूप से मैं वेबफ़ॉर्म के उपयोग से एक दशक के वेब विकास से आने वाले एमवीसी के लिए नया हूं, लेकिन निम्नलिखित ने मेरे लिए काम किया है। स्वीकृत उत्तर के विपरीत यह सभी अतिभारित क्रियाओं को एक ही दृश्य फ़ाइल द्वारा प्रस्तुत करने की अनुमति देता है।

पहले App_Start / RouteConfig.cs में विशेषता रूटिंग को सक्षम करें।

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );            
    }
}

वैकल्पिक रूप से अपने कंट्रोलर क्लास को डिफॉल्ट रूट प्रीफिक्स के साथ सजाएं।

[RoutePrefix("Returns")]
public class ReturnsController : BaseController
{
    //.......

फिर अपने नियंत्रक कार्यों को सजाएं जो एक दूसरे को सूट करने के लिए एक सामान्य मार्ग और मापदंडों के साथ ओवरलोड करते हैं। विवश प्रकार के मापदंडों का उपयोग करके आप विभिन्न प्रकारों की आईडी के साथ एक ही यूआरआई प्रारूप का उपयोग कर सकते हैं।

[HttpGet]
// Returns
public ActionResult Index()
{
    //.....
}

[HttpGet]
[Route("View")]
// Returns/View
public ActionResult View()
{
    // I wouldn't really do this but it proves the concept.
    int id = 7026;
    return View(id);
}

[HttpGet]
[Route("View/{id:int}")]
// Returns/View/7003
public ActionResult View(int id)
{
    //.....
}

[HttpGet]
[Route("View/{id:Guid}")]
// Returns/View/99300046-0ba4-47db-81bf-ba6e3ac3cf01
public ActionResult View(Guid id)
{
    //.....
}

आशा है कि यह मदद करता है और किसी को गलत रास्ते पर नहीं ले जा रहा है। :-)


अच्छा काम! मैं बस इस मुद्दे में भाग गया, आपने मुझे बचा लिया! मेरे पास WebForms के साथ "x" वर्ष भी हैं - इसलिए अभी भी बहुत कुछ सीखने की अवस्था है। एमवीसी के बिना नौकरी नहीं मिल सकती है अब-एक-दिन
Tez Wingfield

4

आप ActionResultदोनों से निपटने के लिए एकल का उपयोग कर सकते हैं Postऔर Get:

public ActionResult Example() {
   if (Request.HttpMethod.ToUpperInvariant() == "GET") {
    // GET
   }
   else if (Request.HttpMethod.ToUpperInvariant() == "POST") {
     // Post  
   }
}

उपयोगी है अगर आपके Getऔर Postतरीकों के मिलान हस्ताक्षर हैं।


1
हम्म, एक तरह से पहिया को फिर से मजबूत करना, लेकिन इस बार एक चौकोर आकार में। बस [HttpPost / Get] विशेषताओं का उपयोग क्यों नहीं किया?
सोयडर

इसकी थोड़ी देर हो गई है, लेकिन मुझे लगता है कि मैंने ऐसा किया क्योंकि एमवीसी दो अलग-अलग तरीकों के बीच मेल खाने वाले सिग्स के बीच भेद नहीं कर रहा था। मैं HttpPost विशेषता का उपयोग कर रहा था, हालाँकि मैं अन्य विधि पर HttpGet नहीं लगा रहा था ..
DevDave

@DevDave के साथ-साथ दोनों तरीकों को जिम्मेदार ठहराते हुए, सुनिश्चित करें कि आप system.web.mvc से विशेषताओं का उपयोग कर रहे हैं - और system.web.http से नहीं!
चाल्की

4

मैं अभी इस प्रश्न पर आया हूं और भले ही यह अभी काफी पुराना है, फिर भी यह बहुत प्रासंगिक है। विडंबना यह है कि इस धागे में एक सही टिप्पणी एमवीसी में एक स्व-परिचित शुरुआत द्वारा पोस्ट की गई थी जब उसने पोस्ट लिखा था। यहां तक ​​कि ASP.NET डॉक्स पूरी तरह से सही नहीं हैं। मेरे पास एक बड़ी परियोजना है और मैं सफलतापूर्वक एक्शन विधियों को अधिभारित करता हूं।

यदि कोई साधारण {कंट्रोलर} / {एक्शन} / {आईडी} डिफॉल्ट रूट पैटर्न से परे रूटिंग को समझता है, तो यह स्पष्ट हो सकता है कि किसी भी यूनिक पैटर्न का उपयोग करके कंट्रोलर एक्शन को मैप किया जा सकता है। यहाँ किसी ने बहुरूपता के बारे में बात की और कहा: "HTTP बहुरूपता को नहीं समझता है", लेकिन रूटिंग का HTTP से कोई लेना-देना नहीं है। यह, बस रखा है, स्ट्रिंग पैटर्न मिलान के लिए एक तंत्र।

इस कार्य को करने का सबसे अच्छा तरीका राउटिंग विशेषताओं का उपयोग करना है, उदाहरण के लिए:

[RoutePrefix("cars/{country:length(3)}")]
public class CarHireController
{
    [Route("{location}/{page:int=1}", Name = "CarHireLocation")]
    public ActionResult Index(string country, string location, int page)
    {
        return Index(country, location, null, page);
    }

    [Route("{location}/{subLocation}/{page:int=1}", Name = "CarHireSubLocation")]
    public ActionResult Index(string country, string location, string subLocation, int page)
    {
        //The main work goes here
    }
}

ये क्रियाएँ जैसे /cars/usa/new-yorkऔर उरलों की देखभाल करेंगी/cars/usa/texas/dallas जाएगा, जो क्रमशः पहली और दूसरी अनुक्रमणिका क्रियाओं का मानचित्रण करेंगे।

इस उदाहरण नियंत्रक की जांच से यह स्पष्ट होता है कि यह ऊपर बताए गए डिफ़ॉल्ट मार्ग पैटर्न से परे है। यदि आपका url संरचना आपके कोड नामकरण सम्मेलनों से बिल्कुल मेल खाता है, तो डिफ़ॉल्ट रूप से अच्छी तरह से काम करता है, लेकिन यह हमेशा ऐसा नहीं होता है। कोड डोमेन का वर्णनात्मक होना चाहिए, लेकिन यूआरएल को अक्सर आगे जाने की आवश्यकता होती है क्योंकि उनकी सामग्री अन्य मानदंडों पर आधारित होनी चाहिए, जैसे कि एसईओ आवश्यकताएं।

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

महत्वपूर्ण नोट एक दोष यह है कि ओवरलोड क्रियाओं के लिए url उत्पन्न करने के लिए रूटिंग का उपयोग करना उरहेल्पर.एक्शन का उपयोग करते समय किसी एक्शन नाम के आधार पर काम नहीं करता है। लेकिन यह काम करता है अगर कोई नामित मार्गों का उपयोग करता है, जैसे, UrlHelper.RouteUrl। और नामित मार्गों का उपयोग करना, अच्छी तरह से सम्मानित स्रोतों के अनुसार, किसी भी तरह से जाने का रास्ता है ( http://haacked.com/archive/2010/11/21/onym-routes-to-the-rescue.aspx/ )।

सौभाग्य!


3

आप एक अलग नाम के साथ एक ही विधि का उपयोग करने के लिए [ActionName ("NewActionName") का उपयोग कर सकते हैं:

public class HomeController : Controller
{
    public ActionResult GetEmpName()
    {
        return Content("This is the test Message");
    }

    [ActionName("GetEmpWithCode")]
    public ActionResult GetEmpName(string EmpCode)
    {
        return Content("This is the test Messagewith Overloaded");
    }
}

2

मुझे इसके लिए एक अधिभार की आवश्यकता थी:

public ActionResult Index(string i);
public ActionResult Index(int groupId, int itemId);

कुछ पर्याप्त तर्क थे जहाँ मैंने यह करना समाप्त किया:

public ActionResult Index(string i, int? groupId, int? itemId)
{
    if (!string.IsNullOrWhitespace(i))
    {
        // parse i for the id
    }
    else if (groupId.HasValue && itemId.HasValue)
    {
        // use groupId and itemId for the id
    }
}

यह एक सही समाधान नहीं है, खासकर यदि आपके पास बहुत सारे तर्क हैं, लेकिन यह मेरे लिए अच्छा काम करता है।


1

मैंने अपने आवेदन में भी इसी मुद्दे का सामना किया है। किसी भी तरीके की जानकारी के बिना, मैंने एक्शन हेड पर [ActionName ("SomeMeaningfulName") प्रदान किया है। मसला हल हो गया

[ActionName("_EmployeeDetailsByModel")]
        public PartialViewResult _EmployeeDetails(Employee model)
        {
            // Some Operation                
                return PartialView(model);
            }
        }

[ActionName("_EmployeeDetailsByModelWithPagination")]
        public PartialViewResult _EmployeeDetails(Employee model,int Page,int PageSize)
        {

                // Some Operation
                return PartialView(model);

        }

0

आधार विधि को आभासी बनाएं

public virtual ActionResult Index()

ओवरराइड के रूप में ओवरराइड विधि बनाएँ

public override ActionResult Index()

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


2
आप शायद प्रश्न को गलत समझ रहे हैं। ओपी एक ही नियंत्रक में विधि को ओवरलोड करने के बारे में पूछ रहा है, एक व्युत्पन्न वर्ग में इसे ओवरराइड नहीं कर रहा है।
ऐस

@Andiih: यदि दोनों विधि समान नियंत्रक में हों तो क्या होगा?
धर्मिक भंडारी

0

मुझे यह उत्तर किसी अन्य सूत्र में पोस्ट किया गया है

यह मुख्य रूप से उपयोग किया जाता है यदि आप किसी अन्य नियंत्रक से विरासत में लेते हैं और आधार नियंत्रक से एक एसीड को ओवरराइड करना चाहते हैं

ASP.NET MVC - विभिन्न मापदंडों के साथ एक क्रिया को ओवरराइड करना


0

प्रत्येक नियंत्रक पद्धति के लिए केवल एक सार्वजनिक हस्ताक्षर की अनुमति है। यदि आप इसे अधिभारित करने का प्रयास करते हैं, तो यह संकलन करेगा, लेकिन आपके द्वारा अनुभव की गई रन-टाइम त्रुटि आपको मिल रही है।

यदि आप विभिन्न क्रियाओं (जैसे [HttpGet]और) का उपयोग करने के इच्छुक नहीं हैं[HttpPost] ओवरलोड तरीकों (जो काम करेंगे) को अलग विशेषताओं) , या रूटिंग को बदलते हैं, तो क्या रहता है कि आप या तो एक अलग नाम के साथ कोई अन्य विधि प्रदान कर सकते हैं, या आप कर सकते हैं मौजूदा पद्धति के अंदर प्रेषण। यहाँ मैंने यह कैसे किया:

मैं एक बार ऐसी स्थिति में आया, जहां मुझे पीछे की अनुकूलता बनाए रखनी थी। मूल विधि से दो मापदंडों की उम्मीद थी, लेकिन नए में केवल एक ही था। जिस तरह से मुझे उम्मीद थी कि ओवरलोडिंग ने काम नहीं किया क्योंकि एमवीसी ने एंट्री पॉइंट को और अधिक नहीं पाया।

इसे हल करने के लिए, मैंने निम्नलिखित कार्य किया:

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

    public ActionResult DoSomething(string param1, string param2)
    {
        if (string.IsNullOrEmpty(param2))
        {
            return DoSomething(ProductName: param1);
        }
        else
        {
            int oldId = int.Parse(param1);
            return DoSomething(OldParam: param1, OldId: oldId);
        }
    }
    
    
    private ActionResult DoSomething(string OldParam, int OldId)
    {
        // some code here
        return Json(result);
    }
    
    
    private ActionResult DoSomething(string ProductName)
    {
        // some code here
        return Json(result);
    }

बेशक, यह एक हैक है और इसे बाद में फिर से बनाया जाना चाहिए। लेकिन कुछ समय के लिए इसने मेरे लिए काम किया।

आप एक डिस्पैचर भी बना सकते हैं जैसे:

public ActionResult DoSomething(string action, string param1, string param2)
{
    switch (action)
    {
        case "update":
            return UpdateAction(param1, param2);
        case "remove":
            return DeleteAction(param1);
    }
}

आप देख सकते हैं, कि UpdateAction को 2 मापदंडों की आवश्यकता है, जबकि DeleteAction को केवल एक की आवश्यकता है।


0

विलंब के लिए क्षमा चाहते हैं। मैं उसी समस्या के साथ था और मुझे अच्छे उत्तरों के साथ एक लिंक मिला, जो नए लोगों की मदद करेगा

बाइनरीइंटरलेक्ट वेब साइट और लेखकों के लिए सभी क्रेडिट

असल में, वहाँ चार स्थितियों हैं: विभिन्न क्रियाओं का उपयोग करके , मार्ग का उपयोग कर , अधिभार [NoAction] के साथ विशेषता अंकन और [ActionName] के साथ कार्रवाई विशेषता नाम बदल

इसलिए, यह निर्भर करता है कि आपकी आवश्यकताएं और आपकी स्थिति क्या है।

कैसे भी हो, लिंक का अनुसरण करें:

लिंक: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx


-1

यदि यह विभिन्न विचारों वाले POST के लिए एक GET कार्रवाई का उपयोग करने का प्रयास है जो विभिन्न मॉडलों के साथ कई कार्यों के लिए है, तो प्रत्येक POST कार्रवाई के लिए एक GET कार्रवाई जोड़ने का प्रयास करें जो ताज़ा करने पर 404 को रोकने के लिए पहले GET पर पुनर्निर्देशित करता है।

लंबा शॉट लेकिन सामान्य परिदृश्य।

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