MvcSiteMapProvider MVC5 – Das Hinzufügen von „title“ als Routenwert funktioniert nicht (beabsichtigt)

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

  •  21-12-2019
  •  | 
  •  

Frage

Ich habe gerade ein „Problem“ bei der Verwendung des aktuellen MvcSiteMapProvider MVC5 (von Nuget, aktualisiert von MVC4).Ich habe den RoutValues ​​of Dynamicnodes einen RoutValue -Titel "Titel" hinzugefügt, als ich sie in meinem DynamicNodeProvider erstellt habe.Das hat in der vorherigen Version gut funktioniert, aber nein, ich erhalte eine Fehlermeldung, wenn ich Folgendes versuche:

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.

Ich erhalte die Meldung, dass ich den „Titel“ nicht als benutzerdefinierten Routenparameter hinzufügen soll.Allerdings verwendet mein gesamtes Projekt „{title}“ in den Routendefinitionen und ich müsste alles vom Titel in „{id}“ (oder etwas anderes) ändern.

Nun meine Frage:Ist es irgendwie möglich, den benutzerdefinierten Routenwert „title“ zu den dynamischen Knoten hinzuzufügen?Oder ist es einfach nicht möglich?

Dank im Voraus!

War es hilfreich?

Lösung

Diese Einschränkung können Sie durch Vererbung umgehen ReservedAttributeNameProvider und Überschreiben der IsRouteAttribute Methode wie folgt.

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

Anschließend können Sie Ihren neuen ReservedAttributeNameProvider mithilfe eines externen DI einfügen (durch ein Upgrade auf eines der DI-Pakete).Beispielsweise müssten Sie lediglich die bestehende Registrierung durch Ihre eigene ersetzen.Implementierung So würde das in StructureMap aussehen, aber Sie könnten genauso gut jeden anderen DI-Container verwenden.

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

Ich schlage vor, dass Sie langfristig eine eröffnen neues Problem auf GitHub.Ich kann mir keinen Grund vorstellen, warum dies pauschal durchgesetzt werden muss – diese Beschränkung der Attributnamen sollte nur bestehen, wenn die Knoten in XML konfiguriert werden, und in diesem Fall sollte es keine Fehlermeldung geben – ignorieren Sie den Wert einfach stillschweigend.Auch die Tatsache, dass MvcSiteMapNodeAttribute denselben Fehler aufweist, ist eine schlechte Designentscheidung, die aus Version 3 übernommen wurde.Es sollte ein RouteValues-Wörterbuch (zumindest ein JSON-Wörterbuch) geben, um dort Werte zu definieren, anstatt alles in Attribute zu stopfen und zu erraten, welche Werte wohin gehören.Aber so oder so macht es keinen Sinn, Attributnamen aus MvcSiteMapNodeAttribute, dynamischen Knoten oder benutzerdefinierten ISiteMapNodeProvider-Implementierungen auszuschließen, da Attribute die Eigenschaften nicht mehr aktualisieren oder umgekehrt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top