2010-05-05 18 views
1

Est-il possible d'avoir un template avec un contenu html dans vm pour un composant block? Je fais beaucoup de choses en html, et je veux que le html réside dans un .vm, pas dans le codebehind.Modèle en monorail ViewComponent

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> 

Répondre

1

Vous avez la méthode RenderView dans la classe de base de ViewComponent. ce que vous pouvez faire est d'utiliser la surcharge qui écrit la vue sur 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(); 
    }   
} 
+0

Désolé, ce n'est pas tout à fait ce que je faisait. Ce que je cherche, est une méthode pour rendre une section nommée à partir du modèle, quelque chose comme:

$RenderSectionHere("columnOne")

0

Je l'ai enfin trouvé une solution à l'aide technique suggéré StringWriter Ken, mais avec méthode différente. Il est RenderView pas, 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 celui-ci:

#render(sectionOne) 
+0

cool. Maintenant que Monorail est sur github, c'est simplement une question de fork + feature + pull request :) –