2015-07-30 10 views
5

Czy to możliwe, aby określić zawartość wyrażenia lambda (delegat, Akcja, Func <>) ze składni Razor, tak, że gdy ta metoda model jest wykonany w widoku, to wstawić tę zawartość Razor?Czy funkcja lambda może zawierać składnię Razor i zostać wykonana w widoku?

Zamierzony cel ten jest dla naszych programistów, aby móc określić własne treści, która ma zostać wstawiony w konkretnym punkcie w opinii CustomControl użytkownika.

Poniżej znajduje okrojoną przykład kodu, który naśladuje mój obecny układ. Poszczególne części ostrości są RenderSideContent definicja metoda i jej wykonywania połączeń.

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> 

Odpowiedz

3

Tak i nie. Nie, nie można po prostu paszy niestandardową Razor tak, ponieważ w tym kontekście, że masz do czynienia z prostym C# i coś jak <div> nie jest ważny C#. Jednak może zbudować IHtmlString lub MvcHtmlString obiekt w lambda i następnie powrócić że.

jednak będziesz musiał utworzyć wersje formantów niestandardowych zwracają HTML kontra renderowanie HTML. Zasadniczo, pomyśl o Html.Partial vs Html.RenderPartial. Ten pierwszy faktycznie odpowiada na odpowiedź, podczas gdy druga zwraca jedynie MvcHtmlString, która może być renderowana na stronie według własnego uznania.

+0

I był pewien, że to był problem, po prostu nie wiedział, czy istnieje podobny sposób wokół niego. Byłoby miło, gdyby był sposób na bezpośrednie wstrzyknięcie Razorowej składni, bez konieczności ręcznego budowania ciągów przez mój zespół. Na razie właśnie zaimplementowałem funkcję wrapper i pomieszałem w Html.Partial. – haferje

2

Jest to możliwe, przy użyciu matrycy Razor Delegatów:

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

@<text>...</text> jest format. Kompilator maszynki do golenia stworzy wyrażenie lambda. W tej chwili używam ASP.Net Rdzeń, więc wygląda to tak:

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

Tak to powinno działać:

@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/

Patrz także: Are lambda expressions supported by Razor?