【发布时间】: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