2015-07-30 5 views
5

È possibile definire il contenuto di un'espressione lambda (delegato, Azione, Func <>) con la sintassi del Rasoio, in modo che quando questo metodo modello viene eseguito nella vista, esso inserirà il contenuto del Rasoio?E 'possibile che una funzione lambda contenga la sintassi del rasoio e venga eseguita in una vista?

Lo scopo previsto è che i nostri sviluppatori possano definire i propri contenuti personalizzati da inserire in un punto particolare nella vista di CustomControl.

Quanto segue è un codice di esempio semplificato che riproduce il layout corrente. Le parti particolari del focus sono la definizione del metodo RenderSideContent e la sua chiamata in esecuzione.

Index.cshtml

@model My.PageModel 

@My.CustomControl(new CustomControlModel 
    { 
     AreaTitle = "Details", 
     RenderSideContent =() => 
     { 
      <div> 
       @using (My.CustomWrapper("General")) 
       { 
        My.BasicControl(Model.Controls[0]) 
       } 
      </div> 
     } 
    }) 

CustomControl.cshtml

<div> 
    @Model.AreaTitle 
    <div class="my-custom-content"> 
     @Model.RenderSideContent() 
    </div> 
</div> 

risposta

3

Sì e no. No, non puoi semplicemente alimentare Razor personalizzato in quel modo, perché in quel contesto, hai a che fare con C# e qualcosa di simile a <div> non è C# valido. Tuttavia, è possibile creare un oggetto IHtmlString o MvcHtmlString nella lambda e quindi restituire che.

Tuttavia, si sta andando ad avere bisogno di creare versioni dei controlli personalizzati che restituiscono HTML contro rendere HTML. Fondamentalmente, pensare a Html.Partial vs Html.RenderPartial. Il primo scrive effettivamente la risposta mentre il secondo restituisce semplicemente un MvcHtmlString che può essere reso alla pagina a piacimento.

+0

I era certo che quello era il problema, ma non sapevo se esistesse un modo simile per aggirarlo. Sarebbe bello se ci fosse un modo per iniettare direttamente la sintassi del Razor in qualche modo, senza richiedere al mio team di costruire manualmente le proprie stringhe. Per il momento, ho appena implementato una funzione wrapper e mixata in un Html.Partial. – haferje

2

E 'possibile, utilizzando su modelli Razor Delegati:

@{ 
    Func<dynamic, object> b = @<strong>@item</strong>; 
} 
<span>This sentence is @b("In Bold").</span> 

@<text>...</text> è il formato. Il compilatore del rasoio creerà un'espressione lambda. Al momento sto utilizzando ASP.Net core, così sembra che questo:

item => new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_template_writer) => {...} 

Quindi questo dovrebbe funzionare:

@model My.PageModel 

@My.CustomControl(new CustomControlModel 
    { 
     AreaTitle = "Details", 
     RenderSideContent = 
      @<div> 
       @using (My.CustomWrapper("General")) 
       { 
        My.BasicControl(Model.Controls[0]) 
       } 
      </div> 
    }) 

http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx/

Vedi anche: Are lambda expressions supported by Razor?

Problemi correlati