asp.net mvc Priorité des paramètres de routage MVC



asp.net-mvc url-routing (1)

Je suis tombé sur un scénario dans lequel j'avais la configuration par défaut de MVC Route. Ainsi.

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

Puis navigation vers une URL en tant que telle

domain/controller/action/1234

Sur cette page, je naviguais alors vers la même page mais avec des paramètres différents après un certain événement. Ainsi.

    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;

J'ai remarqué que l'URL conservait toujours le même identifiant dans l'URL et fixait les paramètres de la sorte.

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

Ma question est la suivante: existe-t-il un moyen de déterminer une priorité par rapport à l’utilisation éventuelle de la valeur id pour l’URL ou le paramètre?

En fait, j'ai trouvé un moyen de contourner / corriger mon problème en utilisant ce qui suit, qui supprime l'identifiant de l'URL et utilise uniquement des paramètres.

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

Cependant, il était simplement curieux de savoir s'il y avait une priorité dans le routage paramètres vs url


La chaîne de requête n'a rien à voir avec le routage (du moins, sauf si vous personnalisez le routage pour le prendre en compte).

Les valeurs transmises à ModelBinder et à votre méthode d'action sont ModelBinder par les fournisseurs de valeur . Vous pouvez contrôler l'ordre de priorité en modifiant l'ordre dans lequel leur ValueProviderFactory correspondant est enregistré dans la propriété statique ValueProviderFactories.Factories .

Comme vous pouvez le constater, la configuration par défaut consiste à utiliser d’abord RouteDataValueProviderFactory . Si elle ne renvoie aucune valeur, elle essaiera QueryStringValueProviderFactory . Si vous modifiez l'ordre des usines, l'ordre de priorité change.

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




value-provider