2009-04-08 9 views
10

Ho due azioni del controller con lo stesso nome ma con diverse firme del metodo. Essi simile a questa:Come posso evitare AmbiguousMatchException tra due azioni del controller?

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

mio test di unità non hanno alcun problema con il chiamare una o l'altra azione di controllo, ma la mia pagina di prova HTML lancia una System.Reflection.AmbiguousMatchException.

Che cosa deve cambiare per rendere questo lavoro?

risposta

11

Basta avere un metodo come questo.

[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

Inizialmente avevo qualcosa del genere, ma non volevo cambiare tutti i miei test unitari per lanciare ActionResult sul tipo appropriato (così come aggiungere il null alla firma). Tuttavia, questo è probabilmente il modo migliore in quanto non mi interessa per le altre opzioni. Risposta +1 –

+0

Nota che non è possibile sovraccaricare un'azione. http://stackoverflow.com/questions/436866/can-you-overload-controller-methods-in-asp-net-mvc – Samuel

1

Ci sono due modi per risolvere questo:

1> cambiare il nome del metodo. 2> Fornire diversi attributi ActionName ai due metodi. Puoi definire il tuo attributo.

+0

Dato questo un +1 perché avrebbe funzionato, semplicemente non soddisfaceva le mie esigenze. –

0

C'è l'attributo ActionName. Guarda.

0

Per ovviare a questo problema è possibile scrivere un ActionMethodSelectorAttribute che esamina l'MethodInfo per ogni azione e lo confronta con i valori di modulo pubblicato e poi respinge qualsiasi metodo per cui i valori di forma non coincidono (escludendo il nome del pulsante , ovviamente).

Ecco un esempio: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

Si potrebbe anche fare un semplice ActionMethodSelectorAttribute che guarda solo il nome pulsante di invio, ma che sarebbe legare il vostro controller e visualizzare più da vicino.

Problemi correlati