Frage

Ich habe einige leere Routenwerte, die ich in der Abfragezeichenfolge haben möchte:

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

Wenn ich es dann weitergebe UrlHelper.RouteUrl() Es ignoriert alle Werte und die generierte Abfragezeichenfolge ist leer.Allerdings mögen URLs /?one=&two=&three= sind vollkommen gültig.Wie kann ich das machen?

War es hilfreich?

Lösung

Dieses Verhalten ist in die Standard-Route-Klasse integriert.Es ruft die Methode ParsedRoute.Bind() auf und führt dort diese Prüfung durch:

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

Was bewirkt Folgendes:

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

Dadurch wird effektiv verhindert, dass Abfragezeichenfolgenwerte ausgegeben werden, wenn diese leer sind.Alles, was es tut, ist privat, statisch, intern und kann ansonsten nicht überschrieben werden.Es gibt also eigentlich nur zwei Möglichkeiten, dieses Verhalten zu überschreiben.

  1. Unterklasse Route und Überschreibung von GetVirtualPath(), wobei ParsedRoute.Bind() durch eine benutzerdefinierte Implementierung ersetzt wird.
  2. Unterklasse RouteBase und erstellen Sie eine benutzerdefinierte Routenimplementierung.

Ich denke, die dritte Option besteht darin, es in Ruhe zu lassen, da andere darauf hingewiesen haben, dass dies kein wirkliches Problem darstellt, da ein leerer Parameter in der Abfragezeichenfolge nur einen geringen oder keinen Wert hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top