【问题标题】:ASP.NET MVC Controllers and Extending the FrameworkASP.NET MVC 控制器和扩展框架
【发布时间】:2009-07-22 17:22:13
【问题描述】:

有没有办法从框架中捕获“找不到控制器”事件? 也许这个事件不存在。但是,如果我只是选择一个 URL 来抛出框架的路由系统,例如:

http://localhost:54321/foobar

未经修改的最终结果是404错误。

是通过自定义 ControllerFactory 捕获此问题的最简单方法吗?然后从那里处理它。

更新: 我正在寻找一种在请求流中更早地捕获和处理的方法。不在控制器级别。参见 cmets 对 Jon Galloway 的回答。

【问题讨论】:

    标签: .net asp.net-mvc


    【解决方案1】:

    我会在你的路由声明的末尾添加一个包罗万象的路由并在那里处理它。

    /* all your other routes here */
    routes.MapRoute("NotHandled", 
      "{*url}",
      new { controller = "NotFound", action = "Index" });
    

    【讨论】:

    • 那个“NotHandled”是不是框架能识别的魔术字符串?
    • 没有。那只是一个名字。 “神奇”在于它是一个包罗万象的 URL,没有被其他任何东西捕获。
    • 对,如果您愿意,可以将其命名为“猴子”。 {*yournamehere} 路由将匹配任何内容。这就是为什么最后列出它很重要,否则它会阻止您的其他路线匹配。
    • Jon - 那么我仍然需要一个硬编码的控制器。我正在寻找比这更多的控制权。就像启动 Microsoft.Scripting.Hosting.ScriptEngine 来处理请求的能力一样。想法?
    • 自定义 ControllerFactory 是不是扩展 MVC 代码而不改变它的最佳方式?
    【解决方案2】:

    我认为这里的问题比表面上看到的要多。

    特别是,当用户在有效控制器上调用有效操作,而请求的资源(产品、文章、子类别等)不存在时会发生什么?

    此外,出于搜索引擎的目的,无效 URL 需要返回真正的 404 错误。

    有关这些问题的详细检查,请参阅以下帖子:

    ASP.NET MVC 中基于资源的 404 错误的策略
    http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/

    【讨论】:

    • 实际上,如果辅助系统无法处理它,则找不到控制器将被交给“辅助系统”......那么你是对的,它应该返回 404。控制器上的缺失操作 -还有404
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2013-09-05
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多