Precedencia del parámetro de enrutamiento MVC

Me encontré con un escenario donde tenía la configuración de ruta MVC predeterminada. Al igual que.

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

Luego navegando a una url como tal

 domain/controller/action/1234 

En esta página, estaba navegando hacia la misma página pero con diferentes parámetros después de cierto evento. Al igual que.

  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; 

Noté que la url todavía conservaba la misma identificación en la url y adjuntaba parámetros como ese.

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

Ahora mi pregunta es, ¿hay alguna manera de determinar una precedencia sobre si debería usar el valor para id de la URL o del parámetro?

De hecho, he encontrado una solución / solución para mi problema mediante el siguiente, que elimina la identificación de la url y simplemente utiliza parámetros.

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

Sin embargo, era simplemente curioso si hay una prioridad en los parámetros frente al enrutamiento url.

    La cadena de consulta no tiene nada que ver con el enrutamiento (al menos, a menos que personalices el enrutamiento para considerarlo).

    Los valores que pasan a ModelBinder y a su método de acción los realizan Value Providers . Puede controlar el orden de precedencia cambiando el orden en que su ValueProviderFactory correspondiente se registra en la propiedad estática de ValueProviderFactories.Factories .

    enter image description here

    Como puede ver, la configuración predeterminada es usar primero RouteDataValueProviderFactory y, si no devuelve ningún valor, probará QueryStringValueProviderFactory . Si cambia el orden de las fábricas, el orden de precedencia cambia.

     ValueProviderFactories.Factories.RemoveAt(3); ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory());