Shaddix
Shaddix

Reputation: 6109

How to merge htmlAttributes for Html.ActionLink (MVC3)?

I'm going to write a simple helper that wraps Html.ActionLink and adds a certain class attribute to it. At the moment it looks like:

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

It actually adds needed @class attribute, but ignores all the passed htmlAttributes. So, if being used like

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

it outputs

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

but I want it to have 2 classes: class="class1 MyClass"

How can I merge those htmlAttributes?

Upvotes: 4

Views: 6204

Answers (3)

GDemartini
GDemartini

Reputation: 351

A bit simpler than hazzik's answer:

@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)
}

Upvotes: 0

Qasim
Qasim

Reputation: 11

This can be achieved simply appending tag in jquery script like this,

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

Upvotes: 1

hazzik
hazzik

Reputation: 13344

Try this snippet

@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)
}

Upvotes: 8

Related Questions