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

Gij*_*ijs 44 asp.net-mvc asp.net-mvc-partialview

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

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

的InnerException:

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

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

@Html.Action("RandomSponsor", "Home")
Run Code Online (Sandbox Code Playgroud)

家庭控制器中的方法.

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

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

RandomSponsor.schtml(仅包含图像字符串)

<img src="~/Content/Images/Advert/@(Model)" alt="a" />
Run Code Online (Sandbox Code Playgroud)

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

问候.

Cla*_*edi 77

如果执行请求是a POST,那么它将尝试找到RandomSponsor接受的方法HttpPost.如果这是有道理的,你可以删除HttpGet,这应该做的伎俩.

  • 好的,我已经看过这个了,它最初没有注册; 如果你有多个以POST开头的调用层*(我有一个操作返回一个返回调用RenderAction的局部视图的视图),那么对RenderAction的调用将*仍然*寻找一个POST方法.我希望这会阻止其他人花上四个小时:) (8认同)
  • 如何解决此问题而不删除 `[HttpGet]` 属性?我想通过 GET 而不是 POST 将路由值发送到方法。 (2认同)

Mau*_*rez 12

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

非常类似于我在这里遇到的这个问题 - 如何在控制器'controllerNameController'上找不到"公共操作方法'methodActionName'"

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

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

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


Owe*_*ing 6

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

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

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
Run Code Online (Sandbox Code Playgroud)