Search code examples
c#asp.net-mvc-3tagbuilder

When to use MergeAttribute over Attributes.Add


When using TagBuilder one can use TagBuilder.Attributes.Add(..) or TagBuilder. MergeAttribute(..) to add attributes to the HTML element under construction:

TagBuilder formBuilder = new TagBuilder("form");
formBuilder.Attributes.Add("method", "get");
formBuilder.Attributes.Add("action", url);

TagBuilder buttonBuilder = new TagBuilder("input");
buttonBuilder.MergeAttribute("type", "submit");
buttonBuilder.MergeAttribute("value", buttonText);

But how are the two different and when should I prefer one over the other?


Solution

  • By looking at the TagBuilder with dotPeek, I can see that Attributes is an SortedDictionary

    From ctor:

    this.Attributes = new SortedDictionary<string, string>(StringComparer.Ordinal);
    

    Calling Add on a SotredSet ends out calling an internal function AddIfNotPresent(item)

    public bool Add(T item)
    {
      return this.AddIfNotPresent(item);
    }
    

    This means that Attributes.Add is the same as calling MergeAttribute without setting replaceExisting == true.

       public void MergeAttribute(string key, string value, bool replaceExisting)
        {
          ...
    
          if (!replaceExisting && this.Attributes.ContainsKey(key))
            return;
          this.Attributes[key] = value;
        }
    

    So my advice will be to use MergeAttribute over Add and always specify replaceExisting for readability and to make sure not to have unexpected outcomes.