【问题标题】:How to hook into the Asp.Net Core 6 MVC route system to customize urls generation如何挂钩到 Asp.Net Core 6 MVC 路由系统以自定义 urls 生成
【发布时间】:2022-06-14 23:37:31
【问题描述】:

在旧的 .Net Framework MVC 实现中,我自己创建路由,这样我也可以影响 url 的生成。部分代码:

public class RouteBase : Route
{
    public RouteBase(string url, IRouteHandler routeHandler) : base(url, routeHandler) { }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        if (Url.Contains("{segment}") && !values.ContainsKey("segment"))
            values["segment"] = requestContext.HttpContext.Items["segmentValue"];

        return base.GetVirtualPath(requestContext, values);
    }
}

感谢 GetVirtualPath,我能够检测到路由模板中的特定段并在路由值字典中注入适当的值,以便客户端应用程序在调用例如 Url.RouteUrl(routeName) 时不必指定它.

在 asp.net core 6 中,我现在使用基于属性的路由,但我不知道如何挂钩,以便在生成 url 时向路由值字典中注入一些值。如果我有这样的路线模板:

[Route("{segment}/test", Name = "name"]

我想在调用时注入段:

var url = Url.RouteUrl("name"); // Not passing new { segment = value } as second param

有关信息,我只是在 Startup 中使用它:

app.MapControllers();

【问题讨论】:

  • Asp.Net Core有一个类似的接口叫IRoute,你试过用吗?在我看来,如果你想在进入动作之前对 URL 做一些判断,你可以自定义一个中间件来做到这一点,
  • @XinranShen 好吧,毕竟我不认为中间件能够相对于 url 生成有所帮助。有传入请求时使用中间件。例如,在这里我想挂接到 Url.RouteUrl 以便我可以将值添加到路由值字典中。

标签: c# asp.net-core routes asp.net-core-6.0


【解决方案1】:

在Asp.Net Core中,我使用下面两种方法,都能成功生成URL。

[Route("{segment}/test", Name = "name"]

var url1 = Url.RouteUrl("name", new { segment = "aa" });
var url2 = Url.Action("Action", "Controller", new { segment = "aa" });

【讨论】:

  • 正如我的帖子中所解释的,我不想在所有对 RouteUrl 的调用中传递该段。它的值是全局的,与当前请求无关。所以我需要在另一个层面注入它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多