Modèle dans monorail ViewComponent
-
03-10-2019 - |
Question
Est-il possible d'avoir un modèle avec un contenu HTML dans vm pour un composant de bloc?
Je fais beaucoup de choses en html, et que vous voulez le résident html dans un .vm, pas codebehind.
Voici ce que j'ai:
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>
");
}
}
Voici ce que je veux: pageWithTwoColumns.vm:
#blockcomponent(TwoColumn)
#columnOne
One
#end
#columnTwo
Two
#end
#end
twocolumn / default.vm (pseudocode):
<div class="twoColumnLayout">
<div class="columnOne">
#reference-to-columnOne
</div>
<div class="columnTwo">
#reference-to-columnTwo
</div>
</div>
La solution
Vous avez la méthode RenderView
sur la classe de base du ViewComponent. ce que vous pouvez faire est d'utiliser la surcharge qui écrit la vue en place dans un TextWriter.
juste coller cette méthode dans votre viewcomponent et vous devriez être fait
string RenderViewInPlace(string viewTemplate)
{
var buffer = new StringBuilder();
using (var writer = new StringWriter(buffer))
{
RenderView("myview", writer);
return buffer.ToString();
}
}
Autres conseils
J'ai enfin trouvé une solution en utilisant la technique proposée StringWriter de Ken, mais avec méthode différente. Ce n'est pas RenderView, il est 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();
}
modèle:
<div class="twoColumnLayout">
<div class="columnOne">
$sectionOneText
</div>
<div class="columnTwo">
$sectionTwoText
</div>
</div>
Je suggère une fonction pour monorail, si vous ne me dérange pas. Ce serait formidable de pouvoir consulter la section du modèle de vue comme ceci:
#render(sectionOne)