2009-04-08 10 views
10

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

// 
    // GET: /Stationery/5?asHtml=true 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ContentResult Show(int id, bool asHtml) 
    { 
     if (!asHtml) 
      RedirectToAction("Show", id); 

     var result = Stationery.Load(id); 
     return Content(result.GetHtml()); 
    } 

    // 
    // GET: /Stationery/5 
    [AcceptVerbs(HttpVerbs.Get)] 
    public XmlResult Show(int id) 
    { 
     var result = Stationery.Load(id); 
     return new XmlResult(result); 
    } 

मेरे इकाई परीक्षण एक या अन्य नियंत्रक कार्रवाई बुला के साथ कोई समस्या नहीं है, लेकिन मेरे परीक्षण html पृष्ठ एक System.Reflection.AmbiguousMatchException फेंकता है।

<a href="/Stationery/1?asHtml=true">Show the stationery Html</a> 
<a href="/Stationery/1">Show the stationery</a> 

इस काम को करने के लिए क्या बदलने की आवश्यकता है?

उत्तर

11

बस इस तरह की एक विधि है।

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Show(int id, bool? asHtml) 
{ 
    var result = Stationery.Load(id); 

    if (asHtml.HasValue && asHtml.Value) 
     return Content(result.GetHtml()); 
    else 
     return new XmlResult(result); 
} 
+0

मुझे मूल रूप से ऐसा कुछ था, लेकिन मैं अपने सभी यूनिट परीक्षणों को एक्शनरसेट को उपयुक्त प्रकार में डालने के लिए नहीं बदलना चाहता था (साथ ही साथ हस्ताक्षर में शून्य जोड़ना)। हालांकि, यह शायद सबसे अच्छा तरीका है क्योंकि मुझे अन्य विकल्पों की परवाह नहीं है। उत्तर +1 –

+0

ध्यान दें कि आप एक क्रिया अधिभारित नहीं कर सकते हैं। http://stackoverflow.com/questions/436866/can-you-overload-controller-methods-in-asp-net-mvc – Samuel

6

Heres a link you may find userful. यह एमवीसी नियंत्रकों को अधिभारित करने के बारे में बात करता है।

+0

यह एक +1 दिया गया यह लिंक मेरा निर्णय लेने में उपयोगी था। –

1

इस पते को हल करने के दो तरीके हैं:

1> विधि का नाम बदलें। 2> दो विधियों के लिए अलग-अलग एक्शननाम गुण प्रदान करें। आप अपनी खुद की विशेषता को परिभाषित कर सकते हैं।

+0

यह एक +1 दिया क्योंकि यह काम करेगा, यह मेरी आवश्यकताओं के अनुरूप नहीं था। –

0

ActionName विशेषता है। जरा देखो तो।

0

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

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

तुम भी एक सरल ActionMethodSelectorAttribute जो केवल सबमिट बटन नाम पर लग रहा है कर सकता है, लेकिन वह अपने नियंत्रक टाई और अधिक बारीकी से देखने जाएगा।

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