Вопрос

Можно ли иметь шаблон с содержимым HTML в VM для блочного компонента?

У меня много вещей в HTML, и хочу, чтобы HTML проживаю в .VM, а не в CodeBehind.

Вот что у меня есть:

    public class TwoColumn : ViewComponent
    {
    public override void Render()
    {
    RenderText(@"
     <div class='twoColumnLayout'>
      <div class='columnOne'>");
     // Context.RenderBody();
    Context.RenderSection("columnOne");
    RenderText(@"
      </div>
      <div class='columnTwo'>");
      Context.RenderSection("columnTwo");
    RenderText(@"
      </div>
     </div>
    ");
    }
   }

Вот что я хочу получить: pagewithtwocolums.vm:

#blockcomponent(TwoColumn)
 #columnOne
  One
 #end
 #columnTwo
  Two
 #end
#end

Twocolumn / default.vm (псевдокод):

<div class="twoColumnLayout">
 <div class="columnOne">
  #reference-to-columnOne
 </div>
 <div class="columnTwo">
  #reference-to-columnTwo
 </div>
</div>
Это было полезно?

Решение

У тебя есть RenderView Метод на базовом классе ViewComponent. То, что вы можете сделать, это использовать перегрузку, которая записывает представление на месте в текстористу.

Просто придерживайтесь этого метода в ваш ViewConent, и вы должны быть сделаны

string RenderViewInPlace(string viewTemplate)
{
    var buffer = new StringBuilder();
    using (var writer = new StringWriter(buffer))
    {
        RenderView("myview", writer);
        return buffer.ToString();
    }           
}

Другие советы

Наконец-то я нашел решение с использованием предложенного KEN StringWriter Technique, но с другим методом. Это не Renderview, это рендеры

public override void Render()
{
    PropertyBag["sectionOneText"] = RenderSectionInPlace("sectionOne");
    PropertyBag["sectionTwoText"] = RenderSectionInPlace("sectionTwo");
    base.Render();
}

public string RenderSectionInPlace(string sectionName)
{

    var stringBuilder = new StringBuilder();
    Context.RenderSection(sectionName, new StringWriter(stringBuilder));
    return stringBuilder.ToString();
}

шаблон:

<div class="twoColumnLayout">
 <div class="columnOne">
  $sectionOneText
 </div>
 <div class="columnTwo">
  $sectionTwoText
 </div>
</div>

Я бы предложил функцию для монорельса, если вы не возражаете. Было бы здорово иметь возможность ссылаться на раздел от просмотра шаблона, как это:

#render(sectionOne)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top