【问题标题】:A public action method 'undefined' was not found on controller '#######'在控制器“#######”上找不到公共操作方法“未定义”
【发布时间】:2013-08-31 03:32:31
【问题描述】:

今天, 我在 db 中记录了这个错误,有任何想法或线索来修复这个间歇性的 asp.net mvc 异常。 谢谢

Unhandled System.Web.HttpException (0x80004005): A public action method 'undefined' was not found on controller '#######'.
   at System.Web.Mvc.Controller.HandleUnknownAction(String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)    at System.Web.Mvc.Controller.HandleUnknownAction(String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

【问题讨论】:

    标签: asp.net-mvc undefined


    【解决方案1】:

    我不能肯定地说,但我怀疑这是在 JavaScript 中构建的 URL 未定义变量的结果。

    类似:

    var action
    var url = '/myContoller/' + action
    

    这将导致请求:

    /myContoller/未定义

    预期的 URL 可能用于甚至不打算成为 MVC 路由的东西。可能是图像或其他东西。

    var imageUrl
    var url = '/folder/' + imageUrl
    

    /myFolder/未定义

    MVC 将尝试路由该路由,具体取决于您的路由配置方式。

    您的日志中是否有任何关于请求来自何处的信息?

    更新 1:

    如果您希望 MVC 忽略对站点特定区域(例如图像目录)的所有请求,您可以执行以下操作:

    routes.IgnoreRoute("images/{*pathinfo}");
    

    【讨论】:

    • 感谢回复,有什么技术或工具可以捕捉到这个异常路由
    • 在控制器“Kernel.Web.Controllers.APController”上找不到公共操作方法“未定义”。
    • 可能还有其他方法,但我的经验是您需要某种可以捕获引荐来源网址的日志记录。这将使您了解错误请求来自哪个脚本。然后修复脚本。
    • 我需要忽略我的图像文件夹,以免在 Global.asax 中路由,我该怎么做。
    • 感谢 Dan,我可以使用以下代码忽略它:routes.IgnoreRoute("{controller}/undefined");但我正在尝试导致问题的根源,但没有成功
    【解决方案2】:


    根据@Dan 的helpful answer,我已经发现了一种解决图像 URL 路由问题的可能方法:


    所以,因为我在RouteConfig.cs 中有一条针对 404 错误的“包罗万象”的路线:
    // for 404-error page routing
    routes.MapRoute(
        name: "Error",
        url: "{*url}",
        defaults: new { controller = "Error", action = "PageNotFound" }
    );
    


    ...MVC 奇怪地将我通过 Razor @foreach 语句加载的图像解释为 URL:

    // this is triggering the weird problem, dunno why:
    @foreach (string image in this.Model.ImageArray)
    {
        <img src="@this.Url.Content(image)" title="foobar" alt="@image" />
    }
    


    异常类型为HttpException,生成的异常消息为:

    在控制器“MyWebsite.Controllers.HomeController”上找不到公共操作方法“[object HTMLImageElement]”



    在我的RouteConfig.cs 中将routes.IgnoreRoute("MyImageFolderPath/{*pathinfo}"); 放在RegisterRoutes 方法的顶部并没有没有解决这个问题,但是这样做:
    routes.IgnoreRoute("[object HTMLImageElement]");
    


    尽管如此,它仍然看起来很老套,而且由于我处理 404 错误的执行不力......

    您可以通过在您的RouteConfig.cs 以及Global.asax.csApplication_Error 方法中设置断点来验证它是否有效(如果您还在那里处理HttpException 错误)。

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2013-05-15
      • 2021-02-28
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      相关资源
      最近更新 更多