Ich versuche eine einfache benutzerdefinierte Version von Html.ActionLink (...) HtmlHelper
zu erstellenIch 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.
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:
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!
Tags und Links .net c# asp.net asp.net-mvc-4