Вопрос

У меня есть несколько пустых значений маршрута, которые я хочу видеть в строке запроса:

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

Если я затем передам его UrlHelper.RouteUrl() он игнорирует все значения, и сгенерированная строка запроса пуста.Однако URL-адреса типа /?one=&two=&three= совершенно действительны.Как мне это сделать?

Это было полезно?

Решение

Это поведение встроено в класс Route по умолчанию.Он вызывает метод ParsedRoute.Bind(), где выполняет следующую проверку:

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

Что делает это:

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

Это эффективно предотвращает вывод любых значений строки запроса, если они пусты.Все, что он делает, является частным, статическим, внутренним и другим способом невозможно переопределить.Итак, на самом деле есть только два варианта переопределить это поведение.

  1. Подкласс Route и переопределите GetVirtualPath(), заменив ParsedRoute.Bind() собственной реализацией.
  2. Подкласс RouteBase и создайте собственную реализацию маршрута.

Я предполагаю, что третий вариант — оставить его в покое, поскольку другие отметили, что на самом деле это не проблема, поскольку наличие пустого параметра в строке запроса имеет мало значения или вообще не имеет его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top