MVCSITEMPPROVIDER MVC5 - Agregar "título" como valor de ruta que no funciona (previsto)

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Acabo de recibir un 'problema' utilizando el MVCSitemApprovider MVC5 actual (de NUDET, actualizado desde MVC4). Solía agregar un "título" de ROUTEVALUE a los eválidos de DynamicNodes al crearlos en mi dinamicnodeprovide. Esto funcionó bien en la versión anterior, sin embargo, no recibo un error al intentarlo:

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.

Recibo el mensaje, no se supone que agrego el "título" como un parámetro de ruta personalizado. Sin embargo, mi proyecto completo usa "{título}" en las definiciones de ruta, y tendría que cambiar todo, desde el título a "{id}" (o algo más).

Ahora, mi pregunta: ¿es posible agregar la ruta de "título" personalizado a los dinamicnodos de todos modos?¿O simplemente no es posible?

¡Gracias de antemano!

¿Fue útil?

Solución

Puede dividir esta limitación heredando >> ReservendatTributeNameProvider y anulando el isrouteattribute método de la siguiente manera.

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-");
    }
}

Puede inyectar su nuevo New ReservedAttributeNameProvider usando DI externo (actualizando a uno de los paquetes DI). Por ejemplo, solo necesitaría reemplazar el registro existente con el suyo propio. Implementación Así es como eso se vería en StructureMap, pero podría usar cualquier otro contenedor de DI.

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

Sugerio a largo plazo. Abre una nuevo número en GitHub. No puedo pensar en ninguna razón por la que esto debe aplicarse a través de la placa: esta limitación de nombres de atributos solo debe existir si está configurando los nodos en XML, y en ese caso no debe haber un mensaje de error, simplemente ignore silenciosamente el valor. Además, el hecho de que MvcSitemapnodeAttribute tiene este mismo fallo es una decisión de mal diseño que se llevó a cabo de V3. Debería haber un "Diccionario" (bueno, JSON Dictionary de todos modos) para definir valores allí en lugar de abarrotar todo en atributos e intentando adivinar qué valores van. Pero de cualquier manera, no tiene sentido excluir los nombres de atributos de MVCSItemApnoDeatTribe, nodos dinámicos o implementaciones personalizadas de ISITEMAPNodeProvider, ya que los atributos ya no actualizan las propiedades o viceversa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top