TagBuilder.MergeAttributes无法按预期工作

Cat*_*lin 9 c# asp.net-mvc html-helper mvchtmlstring

我正在尝试制作一个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>");
}
Run Code Online (Sandbox Code Playgroud)

这是我的看法:

@Html.List(new { @class = "testClass" })
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 29

MergeAttributes会覆盖标记上已有的属性,AddCssClass会在类值中附加名称.

所以只需切换它就可以了;

    tag.MergeAttributes(attributes, false);
    tag.AddCssClass("myClass");
Run Code Online (Sandbox Code Playgroud)

AddCssClass将追加到它上面合并的类名.


tpe*_*zek 16

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

正如您所看到的,它只为集合添加了新属性(如果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));
}
Run Code Online (Sandbox Code Playgroud)