RouteValueDictionary ignora valores vazios
-
21-12-2019 - |
Pergunta
Eu tenho algumas vazio rota de valores eu quero na seqüência de caracteres de consulta:
var routeValues = new RouteValueDictionary();
routeValues.Add("one", "");
routeValues.Add("two", null);
routeValues.Add("three", string.Empty);
Se eu, então, passá-lo para UrlHelper.RouteUrl()
ele ignora todos os valores e a consulta gerada string está vazia.No entanto, urls, como /?one=&two=&three=
são perfeitamente válidas.Como posso fazer isso?
Solução
Esse comportamento é construído para a Rota padrão de classe.Ele chama o ParsedRoute.Bind() método onde ele faz esta verificação:
if (IsRoutePartNonEmpty(obj2))
{
acceptedValues.Add(key, obj2);
}
O que faz isso:
private static bool IsRoutePartNonEmpty(object routePart)
{
string str = routePart as string;
if (str != null)
{
return (str.Length > 0);
}
return (routePart != null);
}
Isso impede eficazmente a qualquer seqüência de caracteres de consulta dos valores de saída, se eles estiverem vazios.Tudo o que ele faz é privado, estático, interno, e de outra forma, impossível substituir.Assim, realmente existem apenas 2 opções para substituir esse comportamento.
- Subclasse Rota e substituir GetVirtualPath(), substituindo ParsedRoute.Bind() com uma implementação personalizada.
- Subclasse RouteBase e criar uma rota personalizada implementação.
Eu acho que a 3ª opção é deixá-lo sozinho, como outros já apontaram isso não é realmente um problema, pois ter um vazio parâmetro de seqüência de consulta tem pouco ou nenhum valor.