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>
War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top