标签助手不使用 DynamicRouteValueTransformer

Max*_*Max 7 asp.net-core-mvc asp.net-core asp.net-core-tag-helpers

ASP.NET Core 的标签助手似乎不能与DynamicRouteValueTransformer结合使用。

这是一个 MCVE:假设我们有一个带有两个动作的简单控制器......

public class GenericController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Add()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

... 以及带有标签助手IndexAdd操作的视图链接asp-action

<!DOCTYPE html>
<html>
<body>
   <a asp-action="Add">Add new!</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我们现在/Generic在浏览器中打开并检查页面时,我们会注意到 ASP.NEThref为控制器操作生成了预期值:

<a href="/Generic/Add">Add new!</a>
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。现在让我们创建一个DynamicRouteValueTransformer将所有请求路由到同一个控制器的...

    public class Transformer : DynamicRouteValueTransformer
    {
        public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
        {
            if (values.ContainsKey("controller"))
            {
                values["originalController"] = values["controller"];
                values["controller"] = "Generic";
            }
            return new ValueTask<RouteValueDictionary>(values);
        }
    }
Run Code Online (Sandbox Code Playgroud)

...让我们为端点路由设置它Startup.cs...

            services.AddSingleton<Transformer>();
...
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDynamicControllerRoute<Transformer>("{controller=Home}/{action=Index}/{id?}");
            });

Run Code Online (Sandbox Code Playgroud)

在浏览器中打开/Generic(或任何其他路由,例如/Foobar)并检查页面后,我们现在会注意到asp-action标签助手不再工作:

<a href="">Add new!</a>
Run Code Online (Sandbox Code Playgroud)

由于 href 值为空,因此链接不再有效。看起来动态路由破坏了标签助手。

任何建议的修复或解决方法?