TagBuilder.MergeAttributes 无法按预期工作



我正在尝试制作一个 HtmlHelper,我需要允许用户将自己的自定义属性添加到 html 标签中。

我尝试使用 TagBuilder 类来执行此操作,但似乎它不是合并属性,而是替换它们。

这是我在 C# 中所做的:

public static MvcHtmlString List(HtmlHelper helper, object htmlAttributes)
{
    var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    var tag = new TagBuilder("div");
    tag.AddCssClass("myClass");
    tag.MergeAttributes(attributes, false);
    // tag class property has value "myClass", not "myClass testClass"
    return new MvcHtmlString("<div>");
}

这是我的观点:

@Html.List(new { @class = "testClass" })

我做错了什么?

MergeAttributes 覆盖标记上已有的属性,AddCssClass 将名称追加到类值中。

所以只需切换它,它就会起作用;

    tag.MergeAttributes(attributes, false);
    tag.AddCssClass("myClass");

AddCssClass 将附加到在其上方合并的类名。

TagBuilder.MergeAttributes 方法无法按预期方式工作。这是此方法的确切代码:

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

如您所见,它只会向集合添加新属性(如果replaceExisting设置为 true,则还会替换集合中已有的属性)。它不执行并属性值合并逻辑。如果要合并值,则需要自己完成:

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

我需要合并其他属性(除了类),所以AddCssClass()是不够的。 我写了一个扩展方法来做我认为 MergeAttributes 应该做的事情:

public static class TagBuilderExtensions
{
    public static void TrueMergeAttributes(this TagBuilder tagBuilder, IDictionary<string, object> attributes)
    {
        foreach (var attribute in attributes)
        {
            string currentValue;
            string newValue = attribute.Value.ToString();
            if (tagBuilder.Attributes.TryGetValue(attribute.Key, out currentValue))
            {
                newValue = currentValue + " " + newValue;
            }
            tagBuilder.Attributes[attribute.Key] = newValue;
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新