【问题标题】:Overloaded Action Method not found at Runtime from test在运行时从测试中找不到重载的操作方法
【发布时间】:2014-05-23 21:11:51
【问题描述】:

我有两种操作方法:

 public ActionResult Edit(int id)
 { 
 }
 public ActionResult Edit(Modelname model, string[] strParam)
 {
 }

我正在单元测试中调用 Edit(Modelname,string[])。

var actionResult = controller.Edit(model, strParam);

代码在运行时编译,但是当我调试测试方法时,它给了我一个方法 not found "MissingMethodException"。我尝试评论 Edit(int id) 方法,然后调试,还是一样。其他测试运行良好,感谢任何帮助。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 c#-4.0 visual-studio-2012


    【解决方案1】:

    您的控制器中的操作方法存在模棱两可的匹配。虽然它编译得很好,但 ASP.NET MVC 无法决定在运行时使用哪种方法,它会引发异常。您需要确保它们响应不同类型的 HTTP 请求或重命名其中一个。

    我无法确定您提供的信息,但如果第二种方法是处理 POST 请求,则使用 HttpPost 过滤器将解决问题:

    public ActionResult Edit(int id)
    { 
    }
    
    [HttpPost]
    public ActionResult Edit(Modelname model, string[] strParam)
    {
    }
    

    如果不是这样,重命名是另一种解决方案。如果您有充分的理由不这样做,ASP.NET MVC 提供 ActionName 过滤器来覆盖 ASP.NET MVC 管道的方法名称:

    public ActionResult Edit(int id)
    { 
    }
    
    [ActionName("EditModel")]
    public ActionResult Edit(Modelname model, string[] strParam)
    {
    }
    

    这将使http://example.org/controller/EditModel 命中第二种方法。

    【讨论】:

    • 我在两个方法中都添加了 [HttpGet] 和 [HttpPost] 参数,仍然是同样的错误。我无法更改操作名称,因为所有项目都遵循相同的标准。为什么在运行时出现问题我不明白,两种方法都有不同的参数,我正在正确调用该方法
    • @blackPearl 一个应该有 HttpGet,另一个应该只有 HttpPost。 ASP.NET MVC 使用方法名称来定位操作方法。当您有两个同名的方法时,它无法决定使用哪一个。
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2017-08-30
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多