我遇到了一个问题,我有一个像这样的剃刀助手。通过合并提供的属性和默认属性,我无法从生成的字符串中拥有多个类 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());
}
答案 0 :(得分:2)
我猜您只需要在格式字符串中添加引号:
builder.Append(string.Join(" ", defaultValues.Select(x =>
$"{x.Key}=\"{x.Value}\"")));
如果没有引号,浏览器会将spase分隔的文本视为不同的属性,并自动向其添加=""
。