Razor 声明性助手条件属性 - class 和 space 不工作

Razor Declarative Helper Conditional Attributes - class with space not working

我遇到了一个问题,我有一个像这样的 Razor Helper。我不能通过合并提供的属性和默认属性从生成的字符串中得到多个 class 像这样的 class="test test2"

这是辅助代码。

@helper TextBox(string label
    , string inputId
    , [Optional]object divAttributes
    , [Optional]object labelAttributes
    , [Optional]object inputAttributes)
{
    <div @ControlsHelper.GenerateAttributes(new 
        { @class = @GetClass(ControlClasses.Field) }, divAttributes)>
        <label @ControlsHelper.GenerateAttributes(new 
            { @for = inputId }, divAttributes)>@label</label>
        <input type="text" @ControlsHelper.GenerateAttributes(new 
            { id = inputId }, divAttributes)>
    </div>
}

现在的问题是这个。

@ControlsHelper.GenerateAttributes(new 
        { @class = @GetClass(ControlClasses.Field) }, divAttributes)

假设 divAttributes 包含以下属性。

new
{
    @class = "SampleAdditionalClass",
    id = "myId"
}

现在该方法生成此结果(类型为 IHtmlString

{class=field ronald}

这是正确的,因为它应该合并 class 并在其间添加 space。但是当它在 UI 中呈现时,它会产生这个。

<div class="field" sampleadditionalclass="">

发生这种情况有什么充分的理由吗?

想知道GenerateAttributes代码的朋友,看这里

public static IHtmlString GenerateAttributes(object defaultAttributes
    , [Optional]object suppliedAttributes)
{
    var defaultValues = defaultAttributes.ToRouteDictionary() 
        ?? new RouteValueDictionary();
    var suppliedValues = suppliedAttributes.ToRouteDictionary() 
        ?? new RouteValueDictionary();
    if (defaultValues == null)
        return new HtmlString(string.Empty);

    var builder = new StringBuilder();
    foreach (var suppliedAttrib in suppliedValues)
    {
        if (suppliedAttrib.Key.ToLower() == "class")
        {
            if (defaultValues.ContainsKey(suppliedAttrib.Key))
                defaultValues[suppliedAttrib.Key] 
                    += string.Format(" {0}", suppliedAttrib.Value);
            else
                defaultValues.Add(suppliedAttrib.Key, suppliedAttrib.Value);
        }
        else
        {
            if (defaultValues.ContainsKey(suppliedAttrib.Key))
                defaultValues.Remove(suppliedAttrib.Key);

            defaultValues.Add(suppliedAttrib.Key, suppliedAttrib.Value);
        }
    }
    builder.Append(string.Join(" ", defaultValues.Select(x => 
        $"{x.Key}={x.Value}")));
    return new MvcHtmlString(builder.ToString());
}

我想您只需要在格式字符串中添加引号即可:

builder.Append(string.Join(" ", defaultValues.Select(x => 
    $"{x.Key}=\"{x.Value}\"")));

没有引号浏览器会将空格分隔的文本视为不同的属性,并自动添加 =""