【问题标题】:A public action method '..' was not found on controller '..'在控制器“..”上找不到公共操作方法“..”
【发布时间】:2013-06-01 05:38:45
【问题描述】:

我想在我的 mvc 项目的每个视图页面上放置一个随机图像。所以我创建了一个返回 partialView 的方法,并在共享布局页面中调用该方法。

当我尝试使用正确的用户名和密码登录时,这可以正常工作。用户已登录,每个页面都包含一个随机图像。但是当我给出用户名和密码的无效组合时。共享布局页面找不到我想用我的@Html.Action 调用的控制器,实际上登录视图应该返回错误消息“用户名和密码的无效组合”,当然还有随机图像。

内部异常:

{"在控制器 'Project.WebUI.Controllers.HomeController' 上找不到公共操作方法 'RandomSponsor'。"}

共享布局中的我的 Html.Action。

@Html.Action("RandomSponsor", "Home")

家庭控制器中的方法。

    [HttpGet]   
[ChildActionOnly]
public ActionResult RandomSponsor()
{
    var model = service.getRandomSponsor();
    return PartialView("RandomSponsor", model);
}

getRandomSponsor 方法工作正常,这个总是返回一个随机字符串值,该值返回给 RandomSponsor.cshtml 视图。

RandomSponsor.schtml(只包含图片字符串)

<img src="~/Content/Images/Advert/@(Model)" alt="a" />

我在网上搜索了这个问题,但没有找到解决方案,有人知道这个问题的答案吗? 可能是 HttpPost 的 HttpGet 的问题?

问候。

【问题讨论】:

  • 你能发布你的路由表定义吗? (在 global.asax 中注册路由)以及具有 RandomSponsor() 操作的控制器定义。
  • 我为此aspnetwebstack.codeplex.com/workitem/2295打开了一个错误
  • 我在使用 Mozilla Firefox 45 时遇到了同样的错误。用 Google Chrome 48.0.2564.116 m 做同样的事情,问题就消失了。就我而言,涉及到一些 JavaScript,我怀疑这是问题所在。

标签: asp.net-mvc asp.net-mvc-partialview


【解决方案1】:

如果执行请求是POST,那么它会尝试寻找一个方法RandomSponsor接受HttpPost。如果这有意义,您可以删除HttpGet,这样就可以了。

【讨论】:

  • 好的,我看到了,一开始没有注册;如果您有 许多层 以 POST 开头的调用(我有一个返回视图的操作返回一个调用 RenderAction 的局部视图),那么对 RenderAction 的调用将仍然看起来对于 POST 方法。我希望它会阻止其他人在这上面花费四个小时 :)
  • 如何解决这个问题而不删除[HttpGet] 属性?我想通过 GET 而不是 POST 向方法发送路由值。
  • 哦,我找到了解决方案。 View 由 POST 调用,排除了通过 GET 加载 @Html.Action()
  • @MarcelPopescu 谢谢
【解决方案2】:

如果您有许多以 POST 开头的调用层(我有一个返回视图的操作返回一个调用 RenderAction 的局部视图),也会发生这种情况,那么对 RenderAction 的调用仍将寻找 POST 方法

与我在这里遇到的这个问题非常相似 - How to solve "public action method 'methodActionName' was not found on controller 'controllerNameController'"

如果您想继续接受 HTTP GET 动词并解决将 post 请求级联到 get 请求的问题,请将其添加到您的方法中

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]

请记住,[HttpGet] 与 [AcceptVerbs(HttpVerbs.Get)]

相同

【讨论】:

    【解决方案3】:

    如果请求是POST,但控制器方法注释为[HttpGet],则会发生这种情况。例如,您可能会发出一个POST,它使用带有[HttpGet] 注释的控制器方法返回一个包含用@Html.Action 调用的部分视图的视图。如果原始请求是POST,那么随后调用的所有控制器方法都需要支持POST

    要修复它,您可以使用AcceptVerbs 属性来指定您的控制器方法同时接受POSTGET

    [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
    

    【讨论】:

      【解决方案4】:

      在自定义 MVCForum 的安装时,突然在几个不同的 PartialView(不是全部)上收到此错误。我们没有对错误的方法或视图进行任何更改,所以对于它们为什么会被破坏真的很沮丧。

      在尝试了这篇文章和其他人的其他解决方案后,回顾了所做的更改,最终停止错误的是我们已将 IIS 中的绑定更改为另一个具有“强制小写 URL”URL 重写的域已启用规则。

      当我们禁用强制小写规则时,错误停止并且网站按预期运行。这不是 URL 重写问题(我不认为),因为我们能够强制 www 使用它而没有错误。这是一个小写重写问题。在 www 规则之前或之后是否有小写规则并不重要。

      此解决方案可能不适用于此错误的许多情况,但它对我们有用。希望其他人可以从这样一个简单的修复中受益。

      【讨论】:

        【解决方案5】:

        我刚刚在我的本地 PC 上奇怪地解决了这个问题,确保我的整个请求路径都是小写的。所以试试看吧。

        【讨论】:

          【解决方案6】:

          我知道这是一个相当古老的线程 - 但由于它是 Google 的顶级搜索结果,我想我应该为 MVC.Net 5.2.6 添加一个可能缺失的链接。

          场景

          我试图通过@Html.Action("ActionName", new { Id = 123}) 调用子操作 并收到与上述类似的错误,但其他解决方案均无效。我可以在外部点击控制器动作(即 HttpGet),但子动作不断抛出异常,让我发疯!

          我找到的解决方案

          在两次来回折腾了一段时间后,我开始玩弄我的路由属性。我将控制器设置为:

          [Route("{action}")]
          [RoutePrefix("Prefix")]
          [RouteArea("AreaName")]
          

          由于我只想要一个公共操作“索引”,我删除了 {action} 并在公共操作上放置了一个明确的路由属性,并将我的 ChildActionOnly 属性放回孩子身上。

          在我这样做之后,我开始奔跑,嘿,动作被击中了。

          如果您在使用属性路由时遇到此错误,可能值得一试。 请注意,我确实尝试过路由子操作,但没有成功。

          【讨论】:

            【解决方案7】:

            在我的例子中,同样的问题是随机发生的:

            using (Html.BeginForm())
            

            上面改为:

            using (Html.BeginForm("Action","Controller", FormMethod.Post))
            

            修复了这个问题。

            【讨论】:

            • 改变了,仍然随机发生
            【解决方案8】:

            你试过Html.RenderAction 吗?它通常比 Html.Action 更快,因为它直接与响应流交互,而不是构建字符串。

            您可以查看以下主题以获取更多信息:

            另外需要注意的是,对于Html.ActionHtml.RenderAction,您的视图不需要在Shared 文件夹中,只有在您使用Html.Partial 或@987654328 时才需要@

            【讨论】:

            • Html.PartialHtml.RenderPartial 也不需要在共享文件夹中。如果它与调用它的视图位于同一文件夹中,则可以直接引用它。您还可以使用视图的完整路径,例如~/Views/MyFolder/_Partial.cshtml
            猜你喜欢
            • 2013-05-15
            • 2021-02-28
            • 1970-01-01
            • 2012-05-31
            • 1970-01-01
            • 2013-08-31
            相关资源
            最近更新 更多