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}\"")));
没有引号浏览器会将空格分隔的文本视为不同的属性,并自动添加 =""
。
我遇到了一个问题,我有一个像这样的 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}\"")));
没有引号浏览器会将空格分隔的文本视为不同的属性,并自动添加 =""
。