MvcSiteMapProvider MVC5 - Adicionar o "título" como rota de valor, não de trabalho (pretendido)

StackOverflow https://stackoverflow.com//questions/25038452

  •  21-12-2019
  •  | 
  •  

Pergunta

Eu só tenho um "problema" usando o atual MvcSiteMapProvider MVC5 (do nuget, atualizado a partir do MVC4).Eu usei para adicionar um routevalue "título" para o RouteValues de DynamicNodes quando criá-los na minha DynamicNodeProvider.Isso funcionou bem na versão anterior, no entanto, não eu recebo um erro ao tentar isso:

An exception of type 'MvcSiteMapProvider.Collections.Specialized.ReservedKeyException' occurred in MvcSiteMapProvider.dll but was not handled in user code

Additional information: The node with key 'someKey' may not add a route value with the key 'title' and value 'someValue' to the RouteValues dictionary because the key is a reserved name. Reserved names are keys that are meant for use internally by MvcSiteMapProvider rather than a dictionary value.

Recebo a mensagem, eu não devo adicionar o "título" como um costume parâmetro de rota.No entanto, o meu projeto completo usa "{title}" na rota definições, e eu teria que mudar tudo, desde o título "{id}" (ou algo mais).

Agora a minha pergunta:é de alguma forma possível adicionar o costume "título" routevalue para o dynamicnodes de qualquer maneira?Ou é simplesmente não é possível?

Obrigado antecipadamente!

Foi útil?

Solução

Você pode contornar essa limitação por herança ReservedAttributeNameProvider e substituir o IsRouteAttribute método da seguinte maneira.

public class MyReservedAttributeNameProvider
    : ReservedAttributeNameProvider
{
    public MyReservedAttributeNameProvider(
        IEnumerable<string> attributesToIgnore
        ) : base(attributesToIgnore)
    {
    }

    public override bool IsRouteAttribute(string attributeName)
    {
        return attributeName != "visibility"
            && !attributesToIgnore.Contains(attributeName)
            && !attributeName.StartsWith("data-");
    }
}

Em seguida, você pode injetar seu novo ReservedAttributeNameProvider usando externo DI (através da actualização para uma das DI pacotes).Por exemplo, Você só precisa de substituir o registo existente com o seu próprio.implementação Esta é como que ficaria no StructureMap, mas você pode facilmente usar qualquer outro DI recipiente.

this.For<IReservedAttributeNameProvider>().Use<MyReservedAttributeNameProvider>()
    .Ctor<IEnumerable<string>>("attributesToIgnore").Is(new string[0]);

Eu sugiro que para o longo prazo, você abre um novo problema no GitHub.Eu posso pensar em nenhuma razão para que este tem de ser aplicadas por toda a diretoria, esta limitação de nomes de atributo só deve existir se configurando os nós XML, e, nesse caso, não deve haver nenhuma mensagem de erro, apenas ignorar silenciosamente o valor.Além disso, o fato de que MvcSiteMapNodeAttribute tem essa mesma falha é uma má decisão de design que foi herdada do v3.Deve haver um RouteValues "dicionário" (bem, JSON dicionário de qualquer maneira) para definir os valores lá em vez de socar tudo em atributos e tentar adivinhar quais os valores de ir para onde.Mas de qualquer forma, não faz sentido excluir qualquer atributo de nomes a partir de MvcSiteMapNodeAttribute, dinâmico nós, ou personalizado ISiteMapNodeProvider implementações desde atributos não atualizar as propriedades ou vice-versa.

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