我正在阅读Adam Freeman的Pro ASP.NET Core MVC 2,有关高级路由功能的章节之一包括一种机制,您可以通过IRouter
实现双向旧式URL处理。要点是:
假设您有一个“旧版” URL,例如"/article/Windows_3.1_Overview.html"
使用定制的IRouter
实现,Core 2.0可让您:
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
}
}
<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迁移指南中唯一提到的内容。我尝试使用[
从字面上映射URLroutes.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”也没有帮助。
我可能缺少明显的东西,但是我似乎找不到答案。
app.UseMvcWithDefaultRoute()
如果在Startup.cs文件中有此文件,只需对其进行注释。