2009-04-08 5 views
10

同じ名前で異なるメソッドシグネチャを持つコントローラアクションが2つあります。2つのコントローラアクション間で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); 
    } 

私のユニットテストは、1つまたは他のコントローラのアクションを呼び出すと何の問題を持っていませんが、私のテストhtmlページはSystem.Reflection.AmbiguousMatchExceptionをスロー:彼らはこのようになります。

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

この作品を変更するにはどうすればよいですか?

答えて

11

このような方法が1つあります。

[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 –

+0

アクションをオーバーロードすることはできません。 http://stackoverflow.com/questions/436866/can-you-overload-controller-methods-in-asp-net-mvc – Samuel

6

Heres a link you may find userful. MVCコントローラのオーバーロードについて説明しています。

1>メソッド名を変更してください。

+0

これを+1して、私の決定を下すのに役立ちました。 –

1

2つのメソッドに異なるActionName属性を指定します。独自の属性を定義することができます。

+0

これが機能するので+1してください。私のニーズに合っていません。 –

0

ActionName属性があります。見てみましょう。

0

あなたは、各アクションのMethodInfoを調べ、投稿フォームの値と比較してActionMethodSelectorAttributeを書くことができ、この問題を克服するためには、ボタン名を除いたフォームの値が一致していない任意の方法を(拒否します、 もちろん)。

はここに例を示します - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

はまた、唯一の送信ボタンの名前を見たActionMethodSelectorAttribute単純を作ることができるが、それはあなたのコントローラを結ぶとより密接に見るでしょう。

関連する問題