web-dev-qa-db-ja.com

コントローラー '..'でパブリックアクションメソッド '..'が見つかりませんでした

私は、mvcプロジェクトのすべてのビューページにランダムな画像を配置したかったのです。したがって、partialViewを返すメソッドを作成し、共有レイアウトページでそのメソッドを呼び出します。

正しいユーザー名とパスワードでログインしようとすると、これは正常に機能します。使用済みはログインされ、すべてのページにランダムな画像が含まれています。しかし、ユーザー名とパスワードの無効な組み合わせを指定すると。共有レイアウトページでは、@Html.Actionで呼び出したいコントローラーが見つからず、実際にはログインビューがエラーメッセージ「ユーザー名とパスワードの無効な組み合わせ」で返されます。

InnerException:

{「コントローラ 'Project.WebUI.Controllers.HomeController'でパブリックアクションメソッド 'RandomSponsor'が見つかりませんでした。」}

共有レイアウトのMy Html.Action。

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

Homecontrollerのメソッド。

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

GetRandomSponsorメソッドは正常に機能します。このメソッドは常にRandomSponsor.cshtmlビューに返される1つのランダムな文字列値を返します。

RandomSponsor.schtml(画像文字列のみを含む)

<img src="~/Content/Images/Advert/@(Model)" alt="a" />

この問題をWebで検索しましたが、解決策が見つかりませんでした。誰かがこの問題の答えを知っていますか? HttpPostのHttpGetで何かあるのでしょうか?

よろしく。

43
Gijs

実行中のリクエストがPOSTである場合、RandomSponsorを受け入れるHttpPostメソッドを見つけようとします。これが理にかなっている場合は、HttpGetを削除できます。これでうまくいくはずです。

77
Claudio Redi

これは、POST(RenderActionを呼び出す部分ビューを返すビューを返すアクションがありました)で始まる呼び出しのレイヤーが多数ある場合にも発生する可能性があります。 POSTメソッド

私がここで抱えていたこの問題と非常に似ています- 「パブリックアクションメソッド 'methodActionName'がコントローラー 'controllerNameController'で見つかりませんでした」の解決方法

また、HTTP GET動詞を引き続き受け入れ、カスケードポストリクエストをgetリクエストに修正する場合は、これをメソッドに追加します。

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

[HttpGet]は[AcceptVerbs(HttpVerbs.Get)]と同じであることに注意してください

MVCForumのインストールをカスタマイズするときに、いくつかの異なるPartialView(すべてではない)で突然このエラーを受け取りました。エラーに関するメソッドまたはビューに変更を加えていないため、エラーが発生した理由については本当にイライラしていました。

この投稿や他の投稿で他のソリューションを試した後、行われた変更に戻り、エラーを停止することになったのは、IIS小文字のURL 'URL書き換えルールが有効になっています。

小文字の強制ルールを無効にすると、エラーが停止し、サイトは想定どおりに機能しました。これはURLリライトの問題ではありません(私は考えていません)。エラーなしでwwwを使用して強制することができます。これは、小文字の書き換えの問題です。 wwwルールの前後に小文字のルールがあるかどうかは関係ありませんでした。

このソリューションは、このエラーの多くのケースにはおそらく適用されませんが、私たちにとってはうまくいきました。うまくいけば、他の誰かがそのような簡単な修正から利益を得ることができます。

1
swimex

私はこれがかなり古いスレッドであることを知っています-しかし、Googleの最高の結果であるため、MVC.Net 5.2.6のミッシングリンクを追加する可能性があると考えました。

シナリオ

私は@Html.Action("ActionName", new { Id = 123})を介して子アクションを呼び出そうとしましたが、上記のようなエラーを受け取りましたが、他のソリューションはどれも動作しませんでした。外部でコントローラーアクション(つまり、HttpGet)をヒットすることはできましたが、子アクションは例外をスローし続け、私を夢中にさせていました!

私が見つけた解決策

しばらくの間、二人で飛び回った後、ルーティング属性で遊び始めました。コントローラーを次のようにセットアップしました。

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

必要なパブリックアクションは "Index"だけなので、{action}を削除し、パブリックアクションに明示的なルート属性を配置し、ChildActionOnly属性を子に戻しました。

私がそれをした後、私は走り回ったとちょっと前に-アクションがヒットしました。

属性ルーティングの使用中にこのエラーが発生した場合は、試してみる価値があります。 注:子アクションをルーティングしようとしましたが、これは機能しませんでした。

0
Michael Card

これは、リクエストがPOSTであるが、コントローラーメソッドに[HttpGet]アノテーションが付けられている場合に発生します。たとえば、@Html.Actionアノテーションが付けられたコントローラーメソッドを使用して、[HttpGet]で呼び出された部分ビューを含むビューを返すPOSTを発行できます。元の要求がPOSTである場合、その後に呼び出されるすべてのコントローラーメソッドはPOSTをサポートする必要があります。

これを修正するには、AcceptVerbs属性を使用して、コントローラーメソッドがPOSTGETの両方を受け入れるように指定します。

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
0
Owen Pauling

私の場合、同じ問題が暗黙のうちにランダムに発生していました

using(Html.BeginForm())

上記に変更

使用(Html.BeginForm( "Action"、 "Controller"、FormMethod.Post))

この問題を修正しました。

0
tomekole