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>
Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top