The TagBuilder.MergeAttributes method TagBuilder.MergeAttributes not work as you expect. This is the exact code for this method:
public void MergeAttributes<TKey, TValue>(IDictionary<TKey, TValue> attributes, bool replaceExisting) { if (attributes != null) { foreach (var entry in attributes) { string key = Convert.ToString(entry.Key, CultureInfo.InvariantCulture); string value = Convert.ToString(entry.Value, CultureInfo.InvariantCulture); MergeAttribute(key, value, replaceExisting); } } } public void MergeAttribute(string key, string value, bool replaceExisting) { if (String.IsNullOrEmpty(key)) { throw new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, "key"); } if (replaceExisting || !Attributes.ContainsKey(key)) { Attributes[key] = value; } }
As you can see, it adds new attributes to the collection (if replaceExisting set to true, it also replaces those that are already collected). It does not execute and does not bind merge logic values. If you want to combine values, you need to do it yourself:
public static MvcHtmlString List(this HtmlHelperhelper, object htmlAttributes) { var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); if (attributes.ContainsKey("class")) attributes["class"] = "myclass " + attributes["class"]; else attributes.Add("class", "myClass"); var tag = new TagBuilder("div"); tag.MergeAttributes(attributes, false); return new MvcHtmlString(tag.ToString(TagRenderMode.Normal)); }
tpeczek
source share