【问题标题】:How to dynamically route request to a specific controller and action with the original request paths as parameters如何以原始请求路径作为参数将请求动态路由到特定控制器和操作
【发布时间】:2019-10-30 21:20:46
【问题描述】:

我找不到任何有关中间件端点模式字段格式的文档/详细信息。或者根本就没有端点。仅用于路由的常见用例场景示例。

我想做的是接受这样的请求:

example.com/anything1/anything2

并将其转发至:

example.com/Home/Display?var1=anything1&var2=anything2

浏览器应该会显示原始请求并且不会改变。

我的最终目标是返回 home 控制器的布局以及 view 从数据库中获取数据。

我一直在向它扔随机数据,看看是什么破坏了它,但没有成功理解什么是有效的。

pattern: "{custompath}/{custompage}");

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    endpoints.MapControllerRoute(
        name: "notDefault",
        pattern: "{area:exists}/{controller=Content}/{action=Index}/{id?}");
});

这是适用于我的区域和控制器的当前默认设置,但我也不完全理解为什么。

更新 从 asp.net core 2.2 到 3 的迁移文章说“端点路由支持与 IRouter 相同的路由模式语法和路由模式创作功能”。 https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#mvc-service-registration

没有指向预期语法的链接,但我发现了一些包含信息的旧文章。虽然有帮助,但它们仍然不完整和/或不准确。应用逻辑时,我发现了错误。这是信息最丰富的。 https://aspnetcore.readthedocs.io/en/stable/fundamentals/routing.html

有些路线可以工作,但是当我添加其他路线时会中断。例如,仅当有人键入“Account”作为第一个参数时,才应接受基于上述文章的此路由,但当请求没有路径或参数时,它会操纵请求以包含 Account 下一个路由的控制器默认值。但随后按预期返回最后一条路线。

请求https://localhost:port

endpoints.MapControllerRoute(
    name: "account",
    pattern: "Account/{controller=Dashboard}/{action=Overview}",
    defaults: new { area = "Account" });
endpoints.MapControllerRoute(
    name: "manage",
    pattern: "Manage/{controller=Content}/{action=Index}",
    defaults: new { area = "Manage" });
endpoints.MapControllerRoute(
    name: "default",
    pattern: "",
    defaults: new { controller = "Content", action = "Display", path = "Public", page = "Index" });

它将请求操纵到https://localhost:port/Account/Content/ 以及来自https://localhost:port/Content/Display/ 的内容

我原以为当我没有输入 Account 或 Manage 时,它​​会掉到空白路径并停在那里。但似乎在它到达那里之后它会做一些其他的事情。我想要的一半已经完成了哈哈。

最新更新 目前,我有这个工作与最小的错误。从概念上讲,在制作这些时,我认为模式是我的应用程序中存在的结构(控制器 > 操作 > 参数,这与我最初想象的相反。(模式是用户请求的内容*)

    endpoints.MapControllerRoute(
                    name: "Public",
                    pattern: "{page}",
                    defaults: new { controller = "Content", action = "Display", path = "Public" });
                endpoints.MapControllerRoute(
                    name: "Default",
                    pattern: "{path=Public}/{page=Index}",
                    defaults: new { controller = "Content", action = "Display" });                
                endpoints.MapControllerRoute(
                    name: "Controllers",
                    pattern: "{controller}/{action}/{id?}");

注释:

"areaName:" 在请求中添加引号中的名称。 "defaults:" 操纵请求。我能够注入控制器和动作。

另外需要注意的是,这些端点会影响为使用 asp-* 的链接生成的路由

【问题讨论】:

    标签: c# .net-core asp.net-core-mvc


    【解决方案1】:

    我不认为模式语法或格式的文档存在,但我能够得到一些工作。

    使用下面的代码,我可以发送如下请求:

    example.com/anything1/anything2

    它被转发到控制器“Home”,动作“Display”,anything1 和anything2 作为参数发送。并且用户仍然可以看到原始请求。

    app.UseEndpoints(endpoints =>
    {
         endpoints.MapControllerRoute(
               name: "default",
               pattern: "{path}/{page}",
               defaults: new {controller="Home", action="Display", path="", page="" }); 
    });
    

    此外,在路径和页面的引号中添加文本将允许在未请求任何内容时发送默认值。我最初编写中间件来处理编写整个响应,但必须生成运行速度慢得多的剃须刀页面。这让我可以使用我想要开始的共享布局。

    注意:关于路由命名空间的 .net-core 文档仅限于常见的用例和方法签名,因为默认站点模板以该代码开头,所以相当无用。一篇关于 mvc 路由的旧文章让我想到尝试上面的代码,但仍然不知道后台发生了什么。

    【讨论】:

    • 这主要回答了这个问题。但我意识到这个问题的答案更多是关于 IRouter ,很难找到足够的文档。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多