2009-04-08 6 views
10

Ich habe zwei Controller-Aktionen mit demselben Namen, aber unterschiedlichen Methodensignaturen. Sie sehen wie folgt aus:Wie kann ich AmbiguousMatchException zwischen zwei Controller-Aktionen vermeiden?

// 
    // 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); 
    } 

My Unit-Tests haben kein Problem mit einem Aufruf oder andere Controller-Aktion, aber mein Test HTML-Seite wirft einen System.Reflection.AmbiguousMatchException.

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

Was muss geändert werden, damit dies funktioniert?

Antwort

11

Haben Sie einfach eine Methode wie diese.

[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

Ich hatte ursprünglich so etwas, aber ich wollte nicht alle meine Unit-Tests ändern, um ActionResult auf den entsprechenden Typ zu setzen (und der Signatur den Nullwert hinzuzufügen). Dies ist jedoch wahrscheinlich der beste Weg, da mir die anderen Optionen egal sind. Antwort +1 –

+0

Beachten Sie, dass Sie eine Aktion nicht überlasten können. http://stackoverflow.com/questions/436866/can-you-overload-controller-methods-in-asp-net-mvc – Samuel

1

Es gibt zwei Möglichkeiten, dies zu adressieren:

1> Ändern Sie den Namen der Methode. 2> Stellen Sie den beiden Methoden unterschiedliche ActionName-Attribute zur Verfügung. Sie können ein eigenes Attribut definieren.

+0

Gab das ein +1, weil es funktionieren würde, es war einfach nicht meine Bedürfnisse. –

0

Es gibt das ActionName Attribut. Schau mal.

0

Um dieses Problem zu überwinden, können Sie einen ActionMethodSelectorAttribute schreiben, die die MethodInfo für jede Aktion untersucht und vergleicht sie mit den gebuchten Formularwerte und lehnt dann jede Methode, für die die Formularwerte nicht übereinstimmen (mit Ausnahme der Taste Name , Na sicher).

Hier ist ein Beispiel: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

Sie könnten auch eine einfachere ActionMethodSelectorAttribute machen, die nur auf den Namen Submit-Button sieht aber das würde Ihren Controller binden und genauer betrachten.

Verwandte Themen