Vorlage in Einschienenbahn ViewComponent
-
03-10-2019 - |
Frage
Ist es möglich, eine Vorlage mit HTML-Inhalt in vm für eine Blockkomponente haben?
Ich bin eine Menge Sachen in HTML zu tun, und will die html residiert in einem .vm, nicht in Code-Behind.
Hier ist, was ich habe:
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>
");
}
}
Hier ist, was ich zu bekommen: pageWithTwoColumns.vm:
#blockcomponent(TwoColumn)
#columnOne
One
#end
#columnTwo
Two
#end
#end
twocolumn / default.vm (Pseudo-Code):
<div class="twoColumnLayout">
<div class="columnOne">
#reference-to-columnOne
</div>
<div class="columnTwo">
#reference-to-columnTwo
</div>
</div>
Lösung
Sie haben die RenderView
Methode auf der Basisklasse des ViewComponent. was Sie tun können, ist die Überlastung verwenden, die den Blick in Platz in einen Textwriter schreibt.
Stick gerade diese Methode in Ihrem viewcomponent und Sie sollten getan werden
string RenderViewInPlace(string viewTemplate)
{
var buffer = new StringBuilder();
using (var writer = new StringWriter(buffer))
{
RenderView("myview", writer);
return buffer.ToString();
}
}
Andere Tipps
Ich habe endlich eine Lösung gefunden mit Kens vorgeschlagen String Technik, aber mit unterschiedlichen Verfahren. Es ist nicht Render, es ist 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();
}
Vorlage:
<div class="twoColumnLayout">
<div class="columnOne">
$sectionOneText
</div>
<div class="columnTwo">
$sectionTwoText
</div>
</div>
würde ich eine Funktion für Einschienen vorschlagen, wenn es Ihnen nichts ausmacht. Es wäre toll, die Lage sein, den Abschnitt aus dem Blickfeld Vorlage wie folgt zu verweisen:
#render(sectionOne)