Saya mendapatkan pengecualian intermiten yang mengatakan bahwa asp.net mvc tidak dapat menemukan metode tindakan. Berikut pengecualiannya:
Metode tindakan publik 'Isi' tidak dapat ditemukan pada pengontrol 'Schoon.Form.Web.Controllers.ChrisController'.
Saya rasa saya telah menyiapkan perutean dengan benar karena aplikasi ini berfungsi hampir sepanjang waktu. Berikut adalah metode tindakan pengontrol.
[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
//…
}
Rute:
routes.MapRoute(
"SchoonForm",
"Form/Fill/{subscriberId}",
new { controller = "ChrisController", action = "Fill" },
new { subscriberId = @"\d+" }
);
Dan inilah tumpukannya:
System.Web.HttpException: Metode tindakan publik 'Isi' tidak dapat ditemukan pada pengontrol 'Schoon.Form.Web.Controllers.ChrisController'. di System.Web.Mvc.Controller.HandleUnknownAction (String actionName) di C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: baris 197 di System.Web.Mvc.Controller.ExecuteCore () di C : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: baris 164 di System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) di C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: baris 76 di System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) di C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: baris 87 di System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) di C:
Berikut adalah contoh filter saya, semuanya bekerja dengan cara yang sama:
public class UserIdFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
const string Key = "userId";
if (filterContext.ActionParameters.ContainsKey(Key))
{
filterContext.ActionParameters[Key] = // get the user id from session or cookie
}
base.OnActionExecuting(filterContext);
}
}
Terima kasih, Chris
sumber
PostSomething { return HomePageActionMethod() }
gagal di tempatPostSomething { return RedirectToAction(nameof(HomePageActionMethod)); }
kerja. (dalam kasus kami, tindakan yang melanggar dalam tampilan terletak di pengontrol yang berbeda, dan mungkin pengontrol tersebut tidak sepenuhnya diinisialisasi dengan metode pemanggilan pertama.Jawaban:
Kami menemukan jawabannya. Kami memeriksa log web kami. Itu menunjukkan bahwa kami menerima beberapa tindakan http aneh (kata kerja / metode) seperti OPTIONS, PROPFIND, dan HEAD.
Hal ini tampaknya menjadi penyebab beberapa pengecualian tesis. Ini menjelaskan mengapa itu terputus-putus.
Kami mereproduksi masalah dengan alat curl.exe:
curl.exe -X OPTIONS http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273 curl.exe -X PROPFIND http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273 curl.exe -X HEAD http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
Perbaikan yang kami gunakan adalah menambahkan bagian otorisasi ke web.config:
<authorization> <deny users="*" verbs="OPTIONS, PROPFIND, HEAD"/> </authorization>
sumber
Kami mengalami masalah serupa, tetapi ternyata hal itu terjadi karena pengguna memposting ke pengontrol setelah waktu loginnya habis. Sistem kemudian diarahkan ke layar login. Setelah masuk, ia dialihkan kembali ke URL yang coba dikirim oleh pengguna, tetapi kali ini ia melakukan permintaan GET dan oleh karena itu tidak menemukan tindakan yang ditandai dengan atribut [HttpPost].
sumber
Saya mendapat masalah yang sama di asp.net MVC. kesalahan ini - 404 tidak ditemukan. Saya menyelesaikan masalah dengan cara ini - masukkan kode ini ke
MyAppControllerBase
(MVC)protected override void HandleUnknownAction(string actionName) { this.InvokeHttp404(HttpContext); } public ActionResult InvokeHttp404(HttpContextBase httpContext) { IController errorController = ObjectFactory.GetInstance<PagesController>(); var errorRoute = new RouteData(); errorRoute.Values.Add("controller", "Pages"); errorRoute.Values.Add("action", "Http404"); errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString); errorController.Execute(new RequestContext( httpContext, errorRoute)); return new EmptyResult(); }
sumber
Kami baru saja mengalami masalah yang sama pada aplikasi kami dan saya dapat melacaknya ke masalah javascript / jquery. Kami memiliki tautan dalam aplikasi kami yang ditentukan menggunakan Html.ActionLink () yang kemudian diganti menjadi POST oleh jquery.
Pertama kami telah menentukan tautan:
Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id})
Kemudian kami mengganti tindakan default dengan fungsi SomePostEventHandler kami:
$(document).ready(function() { $('#MyLink').click(SomePostEventHandler); }
Ini mengenai tindakan MVC kami yang memiliki filter HttpPost:
[HttpPost] public ActionResult SomeAction(int id) { //Stuff }
Apa yang kami temukan adalah bahwa sebagian besar waktu ini bekerja dengan baik. Namun, pada beberapa pemuatan halaman yang lambat (atau pengguna yang sangat cepat), pengguna mengklik link sebelum peristiwa jquery $ (document) .ready () diaktifkan, artinya mereka mencoba GET / Controller / SomeAction / XX alih-alih posting.
Kami tidak ingin pengguna MENDAPATKAN url itu, jadi menghapus filter bukanlah pilihan bagi kami. Alih-alih, kami baru saja menghubungkan peristiwa onclick dari tautan tindakan secara langsung (kami harus sedikit mengubah SomePostEventHandler () agar ini berfungsi):
string clickEvent = "return SomePostEventHandler(this);"; Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id}, new { onclick = clickEvent })
Jadi, moral dari cerita ini, setidaknya bagi kami, adalah jika Anda melihat kesalahan ini, lacak URL yang Anda PIKIRKAN untuk Anda POSTING dan pastikan Anda melihatnya.
sumber
Saya juga punya masalah ini.
Dalam kasus saya itu terkait dengan pembatasan kata kerja pada tindakan yang diminta, di mana tampilan itu
POST
hanyalah tampilan parsial yang diminta dalamGET
danHEAD
hanya didukung . MenambahkanPOST
kata kerja keAcceptVerbsAttribute
(dalam MVC 1.0) menyelesaikan masalah.sumber
Dari log IIS, masalah kami disebabkan oleh Googlebot mencoba POST dan GET untuk tindakan pengontrol hanya POST.
Untuk kasus ini saya sarankan menangani 404 like saran Dmitriy.
sumber
Jawaban yang diterima saat ini berfungsi seperti yang diharapkan tetapi bukan kasus penggunaan utama untuk fitur tersebut. Sebagai gantinya gunakan fitur yang ditentukan oleh ASP.NET. Dalam kasus saya, saya menolak semuanya kecuali GET dan POST:
<system.webServer> <security> <requestFiltering> <verbs allowUnlisted="false"> <add verb="GET" allowed="true"/> <add verb="POST" allowed="true"/> </verbs> </requestFiltering> </security> </system.webServer>
Dengan potongan kode di atas, MVC akan mengembalikan 404 dengan benar
sumber
Bukankah seharusnya begitu
routes.MapRoute( "SchoonForm", "Form/Fill/{subscriberId}", new { controller = "Chris", action = "Fill" },
Selain itu, apa fungsi filter Anda? Tidak bisakah mereka menyembunyikan tindakan, seperti ActionMethodSelectorAttribute?
sumber
Saya memiliki masalah serupa dengan qq File Upload
Ketika tindakan posting
/Document/Save
saya mendapatkan pengecualian Metode tindakan publik 'Simpan' tidak ditemukan pada pengontrol 'Project.Controllers.DocumentController'.Tetapi jika tindakan posting adalah
/Document/Save/
, posting itu benar dan berfungsi!Tuhan selamatkan / ?
sumber
Akar masalah saya mirip dengan yang disebutkan di komentar.
Saya adalah
ajaxSubmitting
bentuk setelah mengklik tombol. Salah satu bidang formulir adalah tipeDate
. Namun, karena perbedaan dalam format tanggal antara mesin klien dan server, metode POST tidak dijalankan pada pengontrol. Server mengirim kembali302
tanggapan dan kemudian mengirimGET
permintaan untuk metode yang sama lagi.Namun, aksi dalam pengontrol didekorasi dengan
HttpPost
atribut dan karenanya tidak dapat menemukan metode dan mengirim kembali404
tanggapan.Saya baru saja memperbaiki kode sedemikian rupa sehingga ketidakcocokan dalam format Tanggal tidak akan menyebabkan kesalahan dan masalah telah diperbaiki.
sumber
Hapus
[HttpGet]
atribut dan itu akan berhasil :)sumber
[HttpGet]
sengaja meletakkan atribut itu di sana, untuk mencegah tindakan dipanggil melalui KATA KERJA lainUntuk siapa pun yang mengalami masalah ini dengan sisipan tipe angularjs, MVC dan {{imagepath}} dalam atribut src gambar, misalnya:
"Metode tindakan publik '{{imagepath}} before.png' tidak ditemukan pada pengontrol"
Solusinya adalah dengan menggunakan ng-src, bukan src.
Semoga ini bisa membantu seseorang :)
sumber
Lihat apakah sekadar menelusuri URL yang dipermasalahkan sudah cukup untuk mereproduksi kesalahan. Itu akan terjadi jika tindakan itu hanya didefinisikan sebagai tindakan POST. Melakukan ini memungkinkan Anda untuk mereproduksi kesalahan sesuka hati.
Bagaimanapun, Anda dapat menangani kesalahan secara global seperti di bawah ini. Jawaban lain di sini yang referensi
HandleUnknownAction
hanya menangani URL dengan nama tindakan buruk, bukan nama pengontrol yang buruk. Pendekatan berikut menangani keduanya.Tambahkan ini ke pengontrol dasar Anda (kode tampilan dihilangkan di sini):
public ActionResult Error(string errorMessage) { return View("Error"); // or do something like log the error, etc. }
Tambahkan pengendali pengecualian global ke Global.asax.cs yang memanggil metode di atas atau melakukan apa pun yang ingin Anda lakukan dengan kesalahan 404 yang tertangkap:
void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); // get the exception object HttpException httpException = ex as HttpException; if (httpException != null && httpException.GetHttpCode() == 404) // if action not found { string errorMessage = "The requested page was not found."; RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Base"); routeData.Values.Add("action", "Error"); routeData.Values.Add("errorMessage", errorMessage); Server.ClearError(); Response.TrySkipIisCustomErrors = true; // Go to our custom error view. IController errorController = new BaseController(); errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); } }
sumber