Когда использовать 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 для удобства чтения и чтобы избежать неожиданных результатов.