Modello in monorotaia ViewComponent
-
03-10-2019 - |
Domanda
E 'possibile avere un modello con contenuti HTML in VM per un componente di blocco?
sto facendo un sacco di roba in html, e vogliono l'risiedono HTML in un .vm, non in codebehind.
Ecco quello che ho:
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>
");
}
}
Ecco quello che voglio ottenere: pageWithTwoColumns.vm:
#blockcomponent(TwoColumn)
#columnOne
One
#end
#columnTwo
Two
#end
#end
twocolumn / default.vm (pseudocodice):
<div class="twoColumnLayout">
<div class="columnOne">
#reference-to-columnOne
</div>
<div class="columnTwo">
#reference-to-columnTwo
</div>
</div>
Soluzione
Hai il metodo RenderView
sulla classe di base del ViewComponent. che cosa si può fare è utilizzare il sovraccarico che scrive la vista sul posto in un TextWriter.
proprio bastone questo metodo nella viewcomponent e si dovrebbe essere fatto
string RenderViewInPlace(string viewTemplate)
{
var buffer = new StringBuilder();
using (var writer = new StringWriter(buffer))
{
RenderView("myview", writer);
return buffer.ToString();
}
}
Altri suggerimenti
Ho finalmente trovato una soluzione che utilizza la tecnica StringWriter suggerito di Ken, ma con metodo diverso. Non è 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();
}
template:
<div class="twoColumnLayout">
<div class="columnOne">
$sectionOneText
</div>
<div class="columnTwo">
$sectionTwoText
</div>
</div>
Vorrei suggerire una funzione per monorotaia, se non ti dispiace. Sarebbe bello essere in grado di fare riferimento alla sezione dal modello di vista in questo modo:
#render(sectionOne)