54

我想在我的 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 有关吗?

问候。

4

8 回答 8

92

如果正在执行的请求是 a POST,那么它将尝试找到一个RandomSponsor接受的方法HttpPost。如果这是有道理的,你可以删除HttpGet,这应该可以解决问题。

于 2013-06-05T13:41:48.377 回答
18

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

与我在这里遇到的这个问题非常相似 -如何解决“在控制器 'controllerNameController' 上找不到公共操作方法 'methodActionName'”

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

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

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

于 2016-01-07T03:16:04.197 回答
6

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

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

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
于 2019-07-29T15:47:00.433 回答
2

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

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

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

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

于 2017-11-27T04:42:09.670 回答
2

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

于 2020-07-28T03:03:12.013 回答
0

就我而言,隐式随机发生了同样的问题:

using (Html.BeginForm())

将以上更改为:

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

修复了这个问题。

于 2018-05-28T19:29:06.143 回答
0

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

设想

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

我找到的解决方案

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

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

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

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

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

于 2019-01-08T14:54:18.827 回答
-1

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

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

要注意的另一件事是,对于Html.Actionor Html.RenderAction,您的视图不需要位于SharedHtml.Partial文件夹中,只有在使用or时才需要Html.RenderPartial

于 2013-06-05T15:17:49.380 回答