首页 > 解决方案 > 当 ASP.NET Core MVC 中存在带有星号模板的路由 {*url} 时,不会触发其他控制器

问题描述

我有一个 ASP.NET Core MVC Web 应用程序,我在其中配置了一个所谓的“默认”控制器来处理所有请求。控制器名称是FrontController,它有唯一的动作叫做Index。它的配置方式如下:

routes.MapAreaRoute(
    name: "Front",
    areaName: "Front",
    template: "{*url}",
    defaults: new { controller = "Front", action = "Index" }
);

所有请求都通过这个控制器。我需要配置自定义错误页面来处理内部服务器错误,为此我创建了一个ErrorController应该处理请求的页面。ErrorController有一个名为Error. 路由在默认前端路由之前配置如下:

routes.MapRoute(
    name: "error",
    template: "{controller}/{action}",
    defaults: new { },
    constraints: new { controller = "Error", action = "Error" }
);

并在 Startup 中使用 `` 启用错误处理:

app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}");

问题是定义前端路由时不会触发错误控制器,即使错误路由是在前端路由之前定义的。

标签: asp.netasp.net-coreroutesasp.net-core-mvc

解决方案


您的路由具有包含两个部分{controller}/{action}约束的模板,Error这意味着请求 URL 中必须有一个控制器和一个名为 Error 的操作。您的错误定义说 go to /error,它没有动作。因此这条路线不匹配。

将模板定义为 justerror并将默认值定义为指向的默认值,ErrorController并将操作定义为您想要的任何内容,然后仅在对 URL 完成请求时调用/error,其他所有内容都将通过您的通配符。


推荐阅读