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>
È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top