2009-04-08 57 views
10

我有兩個具有相同名稱但具有不同方法簽名的控制器操作。他們是這樣的:如何避免兩個控制器操作之間的AmbiguousMatchException?

// 
    // 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

我原本有這樣的事情,但我不想改變我的所有單元測試,以將ActionResult轉換爲適當的類型(以及將null添加到簽名中)。但是,這可能是最好的方式,因爲我不關心其他選項。答案+1 – 2009-04-09 12:30:10

1

有解決這個方法有兩種:

1>更改方法名。 2>爲這兩種方法提供不同的ActionName屬性。你可以定義你自己的屬性。

+0

給這個+1,因爲它會工作,它只是不適合我的需要。 – 2009-04-09 12:30:49

0

ActionName屬性。看一看。

0

爲了克服這個問題,你可以寫一個ActionMethodSelectorAttribute該檢查MethodInfo每個動作,並比較其在提交的表單值,然後拒絕了其形式值不匹配的任何方法(不包括按鈕名稱, 當然)。

下面是一個例子: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

你也可以將它看起來只是在提交按鈕名稱的簡單ActionMethodSelectorAttribute但會配合你的控制器和視圖更加緊密。

相關問題