2009-04-08 12 views
10

Ben aynı adı taşıyan, ancak farklı yöntem imzalarla iki kontrolör eylemleri var.İki denetleyici eylemi arasında AmbiguousMatchException'ı nasıl önleyebilirim?

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

Birliğim testleri birini veya diğer denetleyici eylemi çağıran ile hiçbir sorunu var, ama benim test html sayfası System.Reflection.AmbiguousMatchException atar: Onlar buna benziyor.

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

Bunu yapmak için neyin değiştirilmesi gerekiyor?

cevap

11

Bunun gibi bir yöntem var.

[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

Başlangıçta böyle bir şey vardı, ama uygun türe ActionResult döküm için bütün birim testleri değiştirmek (yanı sıra imzaya null adlı ekleyin) istemiyordu. Ancak, bu diğer seçenekler için umurumda değil muhtemelen en iyi yoldur. Cevap +1 –

+0

Bir eylemi aşırı yükleyemeyeceğinizi unutmayın. http://stackoverflow.com/questions/436866/can-you-overload-controller-methods-in-asp-net-mvc – Samuel

1

bu sorunu çözmek için iki yol vardır. 2> İki yönteme farklı ActionName öznitelikleri sağlayın. Kendi özniteliğinizi tanımlayabilirsiniz.

+0

Bunu bir + 1 verdi, çünkü işe yarayacaktı, sadece ihtiyaçlarıma uymuyordu. –

0

ActionName özelliği yoktur. Bir göz at.

0

sonra her eylem için MethodInfo inceler ve yayınlanan Formu değerlerine karşılaştırır ve bir ActionMethodSelectorAttribute yazabilir Bu sorunu aşmak için düğme adının hariç form değerleri eşleşmiyor kendisi için herhangi bir yöntem (reddeder , tabii ki).

İşte bir örnek: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

Ayrıca sadece gönderme düğmesi adı bakar ki ActionMethodSelectorAttribute daha basit yapabilir ama bu senin denetleyici kravat ve daha yakından görmek istiyorum. bağlantı kararımı yapımında faydalı oldu 1

İlgili konular