Когда использовать MergeAttribute вместо Attributes.Add

При использовании TagBuilder можно использовать TagBuilder.Attributes.Add(..) или же TagBuilder. MergeAttribute(..) чтобы добавить атрибуты к строящемуся HTML-элементу:

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);

Но чем они отличаются, и когда я должен предпочесть одно другому?

1 ответ

Решение

Глядя на TagBuilder с помощью dotPeek я вижу, что атрибуты - это SortedDictionary

Из ctor:

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

Вызов Add для SotredSet завершается вызовом внутренней функции AddIfNotPresent(item)

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

Это означает, что Attributes.Add аналогично вызову MergeAttribute без настройки replaceExisting == true,

   public void MergeAttribute(string key, string value, bool replaceExisting)
    {
      ...

      if (!replaceExisting && this.Attributes.ContainsKey(key))
        return;
      this.Attributes[key] = value;
    }

Поэтому мой совет будет использовать MergeAttribute поверх Add и всегда указывать replaceExisting для удобства чтения и чтобы избежать неожиданных результатов.

Другие вопросы по тегам