控制器上未找到公共操作方法'..'

59

我希望在我的MVC项目的每个视图页面上放置一个随机图片。因此,我创建了一个返回PartialView的方法,并在共享的Layout页面中调用该方法。

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

InnerException:

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

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

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

在HomeController中的方法。

    [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" />
我在网上搜索了这个问题,但并没有找到解决方案,请问有谁知道答案吗? 可能和HttpGet或HttpPost有关吗?
谢谢。

你能发布一下你的路由表定义吗?(在global.asax中的RegisterRoutes方法)还有一个控制器定义,其中包含RandomSponsor()操作。 - Pierluc SS
我为此打开了一个错误报告 https://aspnetwebstack.codeplex.com/workitem/2295 - Chris Marisic
我在使用Mozilla Firefox 45时遇到了相同的错误。但在使用Google Chrome 48.0.2564.116 m进行相同操作后,问题已经解决了。在我的情况下有一些JavaScript涉及,并且我怀疑那是问题所在。 - JayJay
8个回答

102

如果执行的请求是 POST,则它将尝试查找一个接受 HttpPost 的方法 RandomSponsor。如果这有意义,您可以删除 HttpGet,然后就可以解决问题了。


10
好的,我已经看到了这个内容,起初没有理解;如果你有很多层以POST开始的调用(我有一个返回视图并调用RenderAction的部分视图),那么对RenderAction的调用仍然会寻找POST方法。希望这能防止其他人浪费四个小时在这上面 :) - Marcel Popescu
2
如何解决不删除 [HttpGet] 属性的问题?我想通过 GET 方法将路由值发送到该方法,而不是 POST。 - pt12lol
哦,我找到解决方案了。视图是通过POST调用的,这排除了通过GET加载@Html.Action() - pt12lol
@MarcelPopescu 谢谢 - FindOutIslamNow

19

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

非常类似于我在此遇到的问题 - 如何解决“控制器'controllerNameController'上未找到公共操作方法'methodActionName'”

如果您想继续接受HTTP GET动词并解决级联POST请求成为GET请求的问题,请将以下内容添加到您的方法中:

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

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


7
如果请求是POST,但控制器方法被注释为[HttpGet],就会发生这种情况。例如,您可能会发出一个POST请求,返回一个包含使用带有[HttpGet]注释的控制器方法调用的局部视图的视图,如果原始请求是POST,随后调用的所有控制器方法都需要支持POST
要解决这个问题,可以使用AcceptVerbs属性来指定您的控制器方法接受POSTGET两种方式:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]

2
在定制MVCForum的安装过程中,突然在几个不同的PartialViews上(而不是所有PartialViews)收到了此错误。我们没有对导致错误的方法或视图进行任何更改,因此这真的很令人沮丧。
在尝试了此帖子和其他帖子上的其他解决方案之后,回顾了所做的更改,最终停止错误的是我们已将IIS中的绑定更改为启用了“强制小写URL”URL Rewrite规则的另一个域。
当我们禁用了强制小写规则时,错误停止了,网站按预期工作。这不是URL Rewrite问题(我认为),因为我们能够使用它强制使用www而没有错误。这是一个小写重写问题。无论我们先有小写规则还是先有www规则都没有关系。
这个解决方案可能并不适用于此错误的许多情况,但它对我们起作用了。希望其他人也能从这样一个简单的修复中受益。

2

令人惊奇的是,我在本地PC上解决了这个问题,只需确保我的整个请求路径都是小写即可。所以你可以尝试一下。


0
在我的情况下,同样的问题会随机发生,与隐式的“:

”有关。
using (Html.BeginForm())

将上述内容更改为:

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

已解决此问题。


1
改变了,但仍然随机发生。 - FindOutIslamNow

0

我知道这是一个相当老的主题 - 但由于它是谷歌排名靠前的结果,所以我想为MVC.Net 5.2.6添加一个可能缺失的链接。

场景

我尝试通过@Html.Action("ActionName", new { Id = 123})调用子操作,结果收到了与上面类似的错误,但其他解决方案都无效。 我可以从外部访问控制器操作(即HttpGet),但子操作始终抛出异常,让我疯狂!

我找到的解决方法

经过一番摸索和试错后,我开始尝试我的路由属性。 我已将控制器设置为:

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

由于我只需要一个公共操作“Index”,因此我删除了{action}并在公共操作上放置了一个明确的路由属性,并将ChildActionOnly属性重新放在子操作上。
这样做后,我运行了一下,嘿,奇迹发生了——操作被命中了。
如果您在使用属性路由时遇到此错误,则可以尝试一下。注意,我确实尝试过路由子操作,但没有成功。

-1
你试过使用 Html.RenderAction 吗?它通常比 Html.Action 更快,因为它直接与响应流交互,而不是构建一个字符串。
你可以查看以下主题以获取更多信息: 另一个需要注意的事项是,对于 Html.ActionHtml.RenderAction,你的视图不需要在 Shared 文件夹中,只有当你使用 Html.PartialHtml.RenderPartial 时才需要。

Html.Partial and Html.RenderPartial don't need to be in the Shared folder either. If it's in the same folder as the view that calls it you can reference it directly. You can also use the full path of the view eg ~/Views/MyFolder/_Partial.cshtml - Carl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接