将IRouter使用情况迁移到ASP.NET Core 3.1

问题描述 投票:1回答:1

我正在阅读Adam Freeman的Pro ASP.NET Core MVC 2,有关高级路由功能的章节之一包括一种机制,您可以通过IRouter实现双向旧式URL处理。要点是:

假设您有一个“旧版” URL,例如"/article/Windows_3.1_Overview.html"

使用定制的IRouter实现,Core 2.0可让您:

  1. 将旧版URL定向到特定操作(例如Legacy/GetLegacyUrl同时将URL作为参数传递时这样:
public async Task RouteAsync(RouteContext context) 
{
  string requestedUrl = context.HttpContext.Request.Path.Value.TrimEnd('/');

  if (urls.Contains(requestedUrl, StringComparer.OrdinalIgnoreCase)) 
  {
    context.RouteData.Values["controller"] = "Legacy";
    context.RouteData.Values["action"] = "GetLegacyUrl";
    context.RouteData.Values["legacyUrl"] = requestedUrl;
    await mvcRoute.RouteAsync(context); // mvcRoute is an instance of MvcRouteHandler
  }
}
  1. 使用标记帮助器生成相同URL:(<a asp-route-legacyurl="/article/Windows_3.1_Overview.html">Old Link</a>)使用以下内容:
public VirtualPathData GetVirtualPath(VirtualPathContext context) 
{
  if (context.Values.ContainsKey("legacyUrl")) 
  {
    string url = context.Values["legacyUrl"] as string;

    if (urls.Contains(url)) 
    {
      return new VirtualPathData(this, url);
    }
  }

  return null;
}

我的问题是:如何在Core 3.0中做到这一点?我已经尝试过这种方法,但是现在没有MvcRouteHandler了。我试过像这样实现DynamicRouteValueTransformer

public async override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext,
  RouteValueDictionary values)
{
  string requestedUrl = httpContext.Request.Path.Value.TrimEnd('/');

  return await Task.FromResult(new RouteValueDictionary()
  {
    ["controller"] = "Legacy",
    ["action"] = "GetLegacyUrl",
    ["legacyUrl"] = requestedUrl
  });
}

...但据我所读,这仅是一种方法。这也是Microsoft 2.2-> 3.0迁移指南中唯一提到的内容。我尝试使用[

从字面上映射URL
routes.MapRoute(
  name: "",
  template: route,
  defaults: new { controller = "Legacy", action = "GetLegacyUrl", legacyUrl = route });

但是这也不会生成旧版URL,而是选择Legacy/GetLegacyUrl/?legacyUrl=%2Farticle%2FWindows_3.1_Overview.html

我不太确定我还能如何实现这一目标,并且我已经花了好几个小时思考和整理文档。 “在ASP.NET Core中路由”没有帮助,“从ASP.NET Core 2.2迁移到3.0”也没有帮助。

我可能缺少明显的东西,但是我似乎找不到答案。

asp.net routing migration core
1个回答
0
投票
我有这样的问题。就我而言,这是一个问题,当我使用app.UseMvcWithDefaultRoute()

如果在Startup.cs文件中有此文件,只需对其进行注释。

© www.soinside.com 2019 - 2024. All rights reserved.