如何解决“包罗万象的参数只能显示为路线模板的最后一段。”

问题描述 投票:0回答:3

如果我有一个控制器,其操作方法使用基于属性的路由并像这样声明它,那么一切都很好:

    [HttpGet]
    [Route("/dev/info/{*somevalue}")]
    public IActionResult Get(string somevalue) {

        return View();
    }

我可以路由到上述操作方法,例如通过指定以

/dev/info/hello-world
/dev/info/new-world

结尾的 url

但是我的业务要求是有一个如下所示的网址:

/dev/hello-world/info
/dev/new-world/info
并且有无数这样的网址,它们都需要路由到控制器上的相同操作方法。

我想在操作方法上设置基于属性的路由,如下所示:

    [HttpGet]
    [Route("/dev/{*somevalue}/info/")]
    public IActionResult Get(string somevalue) {

        return View();
    }

但是当我这样做时,一旦网络项目运行,我就会收到以下错误:

处理请求时发生未处理的异常。 RouteCreationException:属性路由信息发生以下错误:

对于操作:'App.SomeController.Get (1-wwwSomeProject)' 错误:包罗万象的参数只能显示为路由模板的最后一段。 参数名称:路由模板 Microsoft.AspNetCore.Mvc.Internal.AttributeRoute.GetRouteInfos(IReadOnlyList 操作)

必须有某种方法来解决此错误。知道办法吗?

asp.net-core asp.net-core-mvc asp.net-core-routing
3个回答
3
投票

可以通过使用正则表达式来实现这一点:

[HttpGet]        
[Route(@"/dev/{somevalue:regex(^.*$)}/info/")]
public IActionResult Get(string somevalue)
{
    return View();
}

关于使用正则表达式进行路由约束请参见文档:路由约束参考

正则表达式标记解释:

代币 说明
^ 在行首声明位置
. 匹配任何字符(行终止符除外)
* 匹配前一个令牌零次到无限次,尽可能多次
$ 在行尾声明位置



如果需要在第二段中包含

“world”
后缀,则将此后缀添加到模式中,如下所示:
[Route(@"/dev/{somevalue:regex(^.*world$)}/info/")]


2
投票

中间件是实现这一目标的方法。

如果您需要 api 响应,很容易实现内联。

if (app.Environment.IsDevelopment())
{
    app.Use(async (context, next) =>
    {
        Console.WriteLine(context.Request.Path);
        if (context.Request.Path.ToString().EndsWith("/info"))
        {
            // some logic
            await context.Response.WriteAsync("Terminal Middleware.");
            return;
        }

        await next(context);
    });
}

如果您需要调用控制器,您只需通过中间件编辑请求路径即可实现您的需求。

您可以在此处找到示例:https://stackoverflow.com/a/50010787/3120219


0
投票

只是帮助任何其他使用 Razor Pages 应用程序遇到此问题的人 - 如果使用正则表达式字符串匹配模式来加载 Razor Page 端点,请务必在 Startup.cs 或顶级文件中添加这个小家伙,或每当您阅读本文时 Microsoft 正在做的任何事情:

services.AddRazorPages(options =>
{
    // Add as many of these as you'd like
    options.Conventions.AddPageRoute("/Path/To/Razor/Template", "/{somevalue}/info");
});

最后注意:如果在路由逻辑中使用正则表达式,微软会警告使用正则表达式超时,以免网页容易受到正则表达式 DDOS 攻击。 Stack Overflow 帖子在这里

描述了实现此目的的一种方法
© www.soinside.com 2019 - 2024. All rights reserved.