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

时间:2013-06-05 13:31:28

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

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

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

的InnerException:

  

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

My Html.Action in shared layout。

@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的HttpGet可能是它的东西吗?

问候。

8 个答案:

答案 0 :(得分:73)

如果执行请求是POST,则会尝试找到接受RandomSponsor的方法HttpPost。如果这有意义,你可以删除HttpGet,这应该可以解决问题。

答案 1 :(得分:9)

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

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

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

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

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

相同

答案 2 :(得分:2)

通过确保我的整个请求路径是小写字母,我刚刚在本地PC上以足够奇怪的方式解决了该问题。因此,尝试一下。

答案 3 :(得分:1)

在自定义MVCForum的安装时,在几个不同的PartialViews(不是全部)上突然收到此错误。我们没有对有关错误的方法或观点进行任何更改,因此它们为什么会被破坏真的令人沮丧。

在此帖子和其他人上尝试其他解决方案之后,回过头来做出的更改以及最终停止错误的原因是我们已将IIS中的绑定更改为另一个具有强制执行小写网址的域名& #39;已启用URL重写规则。

当我们禁用强制执行小写规则时,错误停止并且网站按预期工作。这不是网址重写问题(我不这么认为)因为我们能够使用它来强制执行www而没有错误。这是一个小写重写问题。如果我们在www规则之前或之后有小写规则,那没关系。

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

答案 4 :(得分:0)

在我的情况下,同样的问题随着隐含的

随机发生 使用

(Html.BeginForm())

将上方更改为

使用(Html.BeginForm(“Action”,“Controller”,FormMethod.Post))

解决了这个问题。

答案 5 :(得分:0)

我知道这是一个非常老的线程-但作为Google的最佳搜索结果,我认为我应该为MVC.Net 5.2.6添加一个可能缺少的链接。

场景

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

我找到的解决方案

经过两次反复滚动一段时间后,我开始使用路由属性。我将控制器设置为:

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

由于我只需要一个公共动作“索引”,因此我删除了{action},并在该公共动作上放置了一个明确的route属性,然后将ChildActionOnly属性放回了孩子。

完成此操作后,我开始跑步,嘿,presto-动作被击中。

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

答案 6 :(得分:0)

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

要解决此问题,您可以使用AcceptVerbs属性来指定您的控制器方法同时接受POSTGET

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

答案 7 :(得分:-1)

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

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

需要注意的另一件事是,对于Html.ActionHtml.RenderAction,您的视图不需要位于共享文件夹中,只有在您使用{{}时才需要1}}或Html.Partial