模板在单轨ViewComponent(Template in monorail ViewCompon

2019-10-21 12:52发布

是否有可能与在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>

Answer 1:

你有RenderView的基类ViewComponent的方法。 你可以做的是使用写入就地视图到一个TextWriter过载。

只要坚持这种方法在你的viewcomponent,你应该做的事

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


Answer 2:

我终于找到使用肯的建议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)


文章来源: Template in monorail ViewComponent