Pregunta

¿Es posible tener una plantilla con contenido HTML en VM para un componente de bloque?

Estoy haciendo un montón de cosas en html, y quiere residen los html en un .vm, no en código subyacente.

Aquí es lo que tengo:

    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>
    ");
    }
   }

Esto es lo que quiero conseguir: pageWithTwoColumns.vm:

#blockcomponent(TwoColumn)
 #columnOne
  One
 #end
 #columnTwo
  Two
 #end
#end

dos columnas / default.vm (pseudocódigo):

<div class="twoColumnLayout">
 <div class="columnOne">
  #reference-to-columnOne
 </div>
 <div class="columnTwo">
  #reference-to-columnTwo
 </div>
</div>
¿Fue útil?

Solución

tiene el método del RenderView en la clase base de la ViewComponent. lo que puede hacer es utilizar la sobrecarga que escribe la vista en el lugar en un TextWriter.

sólo se adhieren este método en su viewcomponent y que se debe hacer

string RenderViewInPlace(string viewTemplate)
{
    var buffer = new StringBuilder();
    using (var writer = new StringWriter(buffer))
    {
        RenderView("myview", writer);
        return buffer.ToString();
    }           
}

Otros consejos

fin he encontrado una solución mediante la técnica StringWriter sugerido de Ken, pero con método diferente. No es RenderView, es 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();
}

plantilla:

<div class="twoColumnLayout">
 <div class="columnOne">
  $sectionOneText
 </div>
 <div class="columnTwo">
  $sectionTwoText
 </div>
</div>

Yo sugeriría una característica de monorraíl, si no le importa. Sería genial poder hacer referencia a la sección de la plantilla de vista de esta manera:

#render(sectionOne)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top