我想在我的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可能是它的东西吗?
问候。
答案 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
属性来指定您的控制器方法同时接受POST
和GET
:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
答案 7 :(得分:-1)
你用Html.RenderAction
试一试吗?它通常比Html.Action
更快,因为它直接与响应流交互,而不是构建字符串。
您可以查看以下主题以获取更多信息:
需要注意的另一件事是,对于Html.Action
或Html.RenderAction
,您的视图不需要位于共享文件夹中,只有在您使用{{}时才需要1}}或Html.Partial