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?

Foi útil?

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.

  1. Subclasse Rota e substituir GetVirtualPath(), substituindo ParsedRoute.Bind() com uma implementação personalizada.
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top