3

私は、デフォルトのMVCルート設定があったシナリオに遭遇しました。そのようです。そして、このページでは、このようなMVCルーティングパラメータの優先順位

domain/controller/action/1234 

としてURLに移動

routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 

私はその後、特定のイベントの後、同じページに、異なるパラメータを使用してナビゲートしました。そのようです。

var id = $(this).data("id"); 
    var url = "@Url.Action("action", "controller", new { area = ""})"; 
    var params = $.param({id: id, vrnsearch: true}); 
    var fullUrl = url += "?" + params; 

    window.location.href = fullUrl; 

私は、URLがまだ同じIDをURLに保持していて、そうしたパラメータを付けていることに気付きました。

domain/controller/action/1234?id=4321&vrnsearch=true 

今、私の質問は、それはURLからまたはパラメータからIDの値を使用する必要がある場合の優先順位をオーバー決定する方法があります。

実際に私の問題の回避策を見つけました。下のURLを使ってIDを削除し、パラメータを使用します。

@Url.Action("action","controller", new {id = "", area = ""}) 

ただし、パラメータとURLのルーティングに優先順位があるかどうか不思議でした。

答えて

5

クエリ文字列はルーティングとはまったく関係ありません(少なくとも、ルーティングをカスタマイズする場合を除いて)。

ModelBinderとアクションメソッドに渡される値は、値プロバイダによって行われます。優先度の順番を制御するには、対応するValueProviderFactoryが静的​​なValueProviderFactories.Factoriesプロパティに登録されている順番を変更します。

enter image description here

あなたが見ることができるように、デフォルトの構成は、第RouteDataValueProviderFactoryを使用することであり、それは値を返さない場合、それはQueryStringValueProviderFactoryをしようとします。ファクトリの順序を変更すると、優先順位が変更されます。

ValueProviderFactories.Factories.RemoveAt(3); 
ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory()); 
関連する問題