Fügen Sie htmlAttributes für die benutzerdefinierte ActionLink-Helfererweiterung hinzu

8

Ich versuche eine einfache benutzerdefinierte Version von Html.ActionLink (...) HtmlHelper

zu erstellen

Ich möchte dem anonymen htmlAttributes-Objekt, das übergeben wurde, einen Satz zusätzlicher Attribute hinzufügen.

%Vor%

Aus meiner Sicht würde ich das haben:

%Vor%

Was würde ich erwarten, um einen Link wie zu rendern:

%Vor%

Aber stattdessen bekomme ich:

%Vor%

Ich habe verschiedene Methoden ausprobiert, um den anonymen Typ in ein RouteValueDictionary umzuwandeln, indem ich ihn in die root ActionLink (...) -Methode übertrage ODER in Dictionary umwandle, ODER HtmlHelper.AnonymousObjectToHtmlAttributes benutze und dasselbe mache nichts scheint zu funktionieren.

    
wysinawyg 17.01.2014, 14:42
quelle

2 Antworten

11

Das Ergebnis, das Sie erhalten, wird von dieser Quelle code :

%Vor%

Wie Sie sehen können, wird HtmlHelper.AnonymousObjectToHtmlAttributes innen genannt. Deshalb erhalten Sie values und keys , wenn Sie das Objekt RouteValueDictionary object übergeben.

Es gibt nur zwei Methoden, die Ihrer Argumentliste entsprechen:

%Vor%

Die zweite Überladung tut nichts mit Ihren Parametern, übergibt sie nur. Sie müssen Ihren Code ändern, um die andere Überladung aufzurufen:

%Vor%

Wenn Sie routeValues als RouteValueDictionary übergeben, wird die andere Überladung ausgewählt ( RouteValueDictionary implementiert IDictionary<string, object> , also ist es in Ordnung), und die zurückgegebene Verknüpfung ist korrekt.

Wenn das Attribut rel bereits in htmlAttributes Objekt vorhanden ist, wird eine Ausnahme ausgelöst:

%Vor%     
slawek 17.01.2014, 15:53
quelle
1

Wenn Sie das empfangene htmlAttributes-Objekt aktualisieren möchten, sodass Sie ein neues Attribut (rel) hinzufügen können, müssen Sie das anonyme htmlAttributes-Objekt in ein IDictionary<string,object> konvertieren (da dem anonymen Objekt keine neuen Eigenschaften hinzugefügt werden können).

Das bedeutet, dass Sie diese Überladung aufrufen müssen die Methode ActionLink , bei der auch die anonyme routeValues als RouteValueDictionary konvertiert werden muss.

Sie können die Routenwerte leicht mit new RouteValueDictionary(routeValues) konvertieren. Zum Konvertieren der HTML-Attribute benötigen Sie eine Reflexionslogik, zum Beispiel wie in dieser Frage . (Wie bereits von slawek in seiner Antwort erwähnt, könnte man auch den Vorteil nutzen, dass RouteValueDictionary bereits ein Dictionary implementiert und die htmlAttributes auf die gleiche Weise konvertiert)

Am Ende wäre Ihre Erweiterung etwa so:

%Vor%

Wenn Sie es so nennen:

%Vor%

Sie erhalten den folgenden HTML-Code:

%Vor%

Hinweis: Da das rel-Attribut nach dem Hinzufügen der ursprünglichen Attribute zum Wörterbuch hinzugefügt / aktualisiert wird, wird rel="nofollow" immer erzwungen, auch wenn der Aufrufer einen anderen Wert für das Attribut angibt.

Ich hoffe, es hilft!

    
Daniel J.G. 17.01.2014 15:29
quelle

Tags und Links