Razor声明助手条件属性 - 空间不起作用的类

时间:2016-01-14 06:27:48

标签: c# asp.net-mvc-4 razor asp.net-mvc-5 html-helper

我遇到了一个问题,我有一个像这样的剃刀助手。通过合并提供的属性和默认属性,我无法从生成的字符串中拥有多个类 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"
}

现在该方法产生了这个结果(Type为IHtmlString

{class=field ronald}

这是正确的,因为它应该合并类并在它们之间添加空格。但是当它在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());
}

1 个答案:

答案 0 :(得分:2)

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

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

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