2009-04-08 73 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但会配合你的控制器和视图更加紧密。

相关问题