Question

J'ai quelques valeurs de route vides que je veux dans la chaîne de requête :

var routeValues = new RouteValueDictionary();
routeValues.Add("one", "");
routeValues.Add("two", null);
routeValues.Add("three", string.Empty);

Si je le transmets ensuite à UrlHelper.RouteUrl() il ignore toutes les valeurs et la chaîne de requête générée est vide.Cependant, les URL comme /?one=&two=&three= sont parfaitement valables.Comment puis je faire ça?

Était-ce utile?

La solution

Ce comportement est intégré à la classe Route par défaut.Il appelle la méthode ParsedRoute.Bind() où il effectue cette vérification :

if (IsRoutePartNonEmpty(obj2))
{
    acceptedValues.Add(key, obj2);
}

Ce qui fait ceci :

private static bool IsRoutePartNonEmpty(object routePart)
{
    string str = routePart as string;
    if (str != null)
    {
        return (str.Length > 0);
    }
    return (routePart != null);
}

Cela empêche efficacement la sortie des valeurs de chaîne de requête si elles sont vides.Tout ce qu’il fait est privé, statique, interne et autrement impossible à remplacer.Il n’existe donc en réalité que 2 options pour remplacer ce comportement.

  1. Sous-classez Route et remplacez GetVirtualPath(), en remplaçant ParsedRoute.Bind() par une implémentation personnalisée.
  2. Sous-classez RouteBase et créez une implémentation de route personnalisée.

Je suppose que la troisième option est de la laisser tranquille, comme d'autres l'ont souligné, ce n'est pas vraiment un problème car avoir un paramètre vide dans la chaîne de requête a peu ou pas de valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top