Шаблон в монорельсе ViewComponent
-
03-10-2019 - |
Вопрос
Можно ли иметь шаблон с содержимым 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)