何时使用 MergeAttribute 而不是 Attributes.Add

Hen*_*bæk 3 c# tagbuilder asp.net-mvc-3

使用 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);
Run Code Online (Sandbox Code Playgroud)

但这两者有什么不同,我什么时候应该选择其中一种而不是另一种呢?

Hen*_*bæk 5

通过查看TagBuilderdotPeek,我可以看到 Attributes 是一个 SortedDictionary

来自演员:

this.Attributes = new SortedDictionary<string, string>(StringComparer.Ordinal);
Run Code Online (Sandbox Code Playgroud)

在 SotredSet 上调用 Add 最终会调用内部函数 AddIfNotPresent(item)

public bool Add(T item)
{
  return this.AddIfNotPresent(item);
}
Run Code Online (Sandbox Code Playgroud)

这意味着这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;
    }
Run Code Online (Sandbox Code Playgroud)

因此,我的建议是使用 MergeAttribute 而不是 Add,并始终指定 ReplaceExisting 以提高可读性并确保不会出现意外结果。