2016-01-14 6 views
2

У меня возникла проблема, у меня есть помощник 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()); 
} 
+0

Что значения в 'defaultValues' для ключа класса выглядят как в методе' GenerateAttributes'? Они оба одинаковы, т.е. никакие запятые, апострофы и т. д. – Steve

+0

@Steve Да, они такие же, никаких запятых – DevEstacion

+0

Тогда я подозреваю, что ответ Юры верен. – Steve

ответ

2

Я думаю, вы просто должны добавить кавычки в строку формата:

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

без кавычек браузер будет относиться к SPASE разделенный текст как разные атрибуты, и добавьте ="" к нему автоматически.

+0

Спасибо, кажется, я упустил это, я пробовал это, но, возможно, была проблема с моими параметрами, спасибо – DevEstacion

 Смежные вопросы

  • Нет связанных вопросов^_^