2011-09-07 3 views
4

Je vais écrire une aide simple qui enveloppe Html.ActionLink et lui ajoute un certain attribut de classe. À l'heure actuelle, il ressemble à:Comment fusionner htmlAttributes pour Html.ActionLink (MVC3)?

@helper MyActionLink(string text, string action, object routeValues, object htmlAttributes) 
    { 
    @Html.ActionLink(text, action, routeValues, new { @class = "MyClass" }) 
} 

Il ajoute réellement nécessaire @class attribut, mais ne tient pas compte tous les htmlAttributes passé. Donc, si utilisées comme

@MyActionLink("Item1", "Edit", new { itemId = 1 }, new { @class = "class1" }) 

il émet

<a class="MyClass" href="/Test/Edit?itemId=1">Item1</a> 

mais je veux qu'il y ait 2 classes: class="class1 MyClass"

Comment puis-je fusionner ces htmlAttributes?

Répondre

8

Essayez cet extrait

@helper MyActionLink(string text, string action, object routeValues, object htmlAttributes) 
{ 
    var attributes = (IDictionary<string, object>) HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    object cssClass; 
    if(attributes.TryGetValue("class", out cssClass) == false) 
    { 
     cssClass = ""; 
    } 
    attributes["class"] = cssClass + " MyClass"; 

    @Html.ActionLink(text, action, new RouteValueDictionary(routeValues), attributes) 
} 
+0

merci! C'est bien de savoir que ctor de RouteValueDictionary accepte et analyse les objets. – Shaddix

+1

Je viens de voir des sources et conseille d'utiliser 'HtmlHelper.AnonymousObjectToHtmlAttributes' pour la conversion, car il fait une conversion sur les noms de propriété d'objet (comme remplacer' _' par '-') – hazzik

1

Ceci peut être réalisé annexant simplement tag dans le script jquery comme celui-ci,

$("#linkID").html("<span class='ui-icon ui-icon-gear'/>"+$("#linkID").html()); 
0

Un peu plus simple que la réponse de Hazzik:

@helper MyActionLink(string text, string action, object routeValues, object htmlAttributes) 
{ 
    var htmlAttr = HtmlHelper.AnonymousObjectToHtmlAttributes(this.ViewData["htmlAttributes"]); 

    htmlAttr["class"] = ("MyClass " + htmlAttr["class"]).Trim(); 

    @Html.ActionLink(text, action, new RouteValueDictionary(routeValues), htmlAttr) 
} 
+0

Je suppose que this.ViewData [" htmlAttributes " ]) devrait être htmlAttributes. –

Questions connexes