【问题标题】:Razor Declarative Helper Conditional Attributes - class with space not workingRazor 声明性帮助器条件属性 - 带空格的类不起作用
【发布时间】:2016-04-19 09:21:17
【问题描述】:

我遇到了一个问题,我有一个这样的 Razor 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"
}

现在方法产生这个结果(类型是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());
}

【问题讨论】:

  • defaultValues 中类键的值在 GenerateAttributes 方法中是什么样的?他们都一样吗,即。没有逗号、撇号等。
  • @Steve 是的,它们是一样的,没有逗号
  • 那我怀疑Yura的回答是正确的。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我好像忽略了这个,我试过了,但我的参数可能有问题,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多