У меня возникла проблема, у меня есть помощник 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}
Это правильно, как это предполагается объединить классы и добавить пространства между ними. Но когда он появляется в пользовательском интерфейсе, он производит это.
<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
@Steve Да, они такие же, никаких запятых – DevEstacion
Тогда я подозреваю, что ответ Юры верен. – Steve