是否有可能与在VM HTML内容块组件的模板?
我做了很多的东西在HTML,并希望HTML驻留在.vm,而不是在代码隐藏。
这里是我已经有了:
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>
");
}
}
以下是我想:pageWithTwoColumns.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的方法。 你可以做的是使用写入就地视图到一个TextWriter过载。
只要坚持这种方法在你的viewcomponent,你应该做的事
string RenderViewInPlace(string viewTemplate)
{
var buffer = new StringBuilder();
using (var writer = new StringWriter(buffer))
{
RenderView("myview", writer);
return buffer.ToString();
}
}
我终于找到使用肯的建议StringWriter的技术解决方案,但与不同的方法。 这不是的RenderView,这是RenderSection
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)