RouteValueDictionary игнорирует пустые значения
-
21-12-2019 - |
Вопрос
У меня есть несколько пустых значений маршрута, которые я хочу видеть в строке запроса:
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);
}
Это эффективно предотвращает вывод любых значений строки запроса, если они пусты.Все, что он делает, является частным, статическим, внутренним и другим способом невозможно переопределить.Итак, на самом деле есть только два варианта переопределить это поведение.
- Подкласс Route и переопределите GetVirtualPath(), заменив ParsedRoute.Bind() собственной реализацией.
- Подкласс RouteBase и создайте собственную реализацию маршрута.
Я предполагаю, что третий вариант — оставить его в покое, поскольку другие отметили, что на самом деле это не проблема, поскольку наличие пустого параметра в строке запроса имеет мало значения или вообще не имеет его.