Приоритет параметров маршрутизации MVC

Я наткнулся на сценарий, где у меня была настройка MVC Routing по умолчанию. Вот так.

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

Затем переход к URL как таковой

 domain/controller/action/1234 

На этой странице я затем перешел на ту же страницу, но с различными параметрами после определенного события. Вот так.

  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-адрес все еще сохранял один и тот же идентификатор в URL-адресе и добавлял такие параметры.

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

Теперь мой вопрос заключается в том, есть ли способ определить приоритет, если он должен использовать значение id из url или из параметра.

Я действительно нашел работу вокруг / исправить мою проблему, используя приведенное ниже, которое удаляет идентификатор из URL-адреса и просто использует параметры.

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

Однако было просто любопытно, есть ли приоритет в параметрах vs url routing.

Строка запроса не имеет ничего общего с маршрутизацией (по крайней мере, если вы не настроите маршрутизацию для ее рассмотрения).

Значения, переданные ModelBinder и вашему методу действия, выполняются с помощью Value Providers . Вы можете управлять порядком приоритета, изменяя порядок, в котором их соответствующий ValueProviderFactory зарегистрирован в статическом ValueProviderFactories.Factories .

введите описание изображения здесь

Как вы можете видеть, настройка по умолчанию заключается в том, чтобы сначала использовать RouteDataValueProviderFactory и если он не возвращает значения, он попытается QueryStringValueProviderFactory . Если вы измените порядок фабрик, порядок приоритетов изменится.

 ValueProviderFactories.Factories.RemoveAt(3); ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory()); 
Давайте будем гением компьютера.