2

ASP.NET Core MVCでは、Url.Actionで作成されたURLとアクションベースのタグヘルパーがURLにカスタムクエリパラメータを含むようにしたいと考えています。私はコントローラーやアクションに関係なく、これをグローバルに適用したいと思っています。ASP.NET Core MVCのアクションURLにカスタムクエリパラメータを追加

私はoverriding the default route handlerを試しましたが、これは一度に動作しましたが、ASP.NET Coreのアップデートで壊れました。私は間違って何をしていますか?より良い方法がありますか?

答えて

2

DefaultHandlerを上書きするのではなく、コレクションに追加してみてください。以下は、バージョン1.1.2で私のために働い:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    // ... other configuration 
    app.UseMvc(routes => 
    { 
     routes.Routes.Add(new HostPropagationRouter(routes.DefaultHandler)); 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
    // ... other configuration 
} 

ここでは、ルータは単に完全を期すため、です。

public class HostPropagationRouter : IRouter 
{ 
    readonly IRouter router; 

    public HostPropagationRouter(IRouter router) 
    { 
     this.router = router; 
    } 

    public VirtualPathData GetVirtualPath(VirtualPathContext context) 
    { 
     if (context.HttpContext.Request.Query.TryGetValue("host", out var host)) 
      context.Values["host"] = host; 
     return router.GetVirtualPath(context); 
    } 

    public Task RouteAsync(RouteContext context) => router.RouteAsync(context); 
} 
+0

それはうまくいきましたが、私はそれがなぜより良いのか理解してもらいたいと思います。 'IRouteBuilder.Routes'と' IRouteBuilder.DefaultHandler'が 'MapRoute'で作成されたルートと相互にやり取りする方法について説明したり、ドキュメントを指したりできますか? –

+0

@EdwardBreyあなたの質問にはっきりと答えるだけでは不十分です。しかし、私は行動の変化が[このバグ修正に関する](https://github.com/aspnet/Routing/issues/370)であることを知っています。渡された値が適切に行を渡されていませんでした。 –

関連する問題