2011-02-08 4 views
17

Czy wyrażenia lambda/anonimowe metody są obsługiwane w widoku maszynki Razor?Czy wyrażenia lambda są obsługiwane przez maszynkę Razor?

Mam trudności wyrażania następujących w Razor:

@Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      <text> 
       @i.DealerName 
      </text> 
     } 
    } 

Uwaga: Wiem, że można rozwiązać ten problem z @foreach ale muszę podobnego rozwiązania dla sterowania 3rd party MVC. Używa tego mechanizmu do ustawiania zawartości kontrolki. Działa dobrze dla widoków MASC .ASPX, ale nie może go uruchomić z obsługą Razor.


MVC .aspx odpowiednik (kod chciałbym przekonwertować do składni Razor):

<% Model.ToList().ForEach(i => 
     { 
      if (i.DealerName != null) 
      { 
      %> <%=i.DealerName%> <% 
      }; 
     }); 
%> 

To jest dla silnika Razor że statki z ASP.NET MVC3.

Odpowiedz

11

zamiast swojego bloku <text>@i.DealerName</text> można użyć Response.Write(i.DealerName);

wynik jest taki sam, jak ten, jeśli spadnie na stronie Razor - będzie wykonywał podczas renderowania strony .. I szczerze - jestem całkiem pewny to i tak zostanie skompilowane.

Ponadto, ponieważ ForEach() zwraca pustkę, należy ją upuścić na stronie jako blok kodu. Więc twój kod będzie wyglądać następująco:

@{ 
    Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      Response.Write(i.DealerName); 
     } 
    }); 
} 

UPD: Jeśli masz poważniejszy formatowanie, można odwołać się do tego miły mały trick:
(niestety kod kolorowania tu nie dać ten fragment każdy kredyt, ale to na pewno zobaczyć, co mam na myśli, jeśli spadnie to w visual studio. Uwaga: to będzie działać tylko na stronach kolczastego, a nie pliki kodu :))

@{ 
    Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      Response.Write(((Func<dynamic, object>)(
       @<text> 
        <b>Hello Dealer named: @item.DealerName 
        Multiline support is <em>Beautiful!</em> 
       </text>)).Invoke(i)); 
     } 
    }); 
} 

Nadzieja, że ​​sens :)

+0

Tak "Odpowiedź.Pisz "działa, ale dla bardziej złożonego przykładu połączenie strun bardzo szybko wymyka się spod kontroli. :( –

+0

Tak, masz rację. Zaktualizowałem post, aby zezwolić na prawie każdy rodzaj kodu Razor w tej funkcji. Ciesz się :) –

+0

Dzięki za twoje kłopoty wziąłeś Artiom. Szczególnie podoba mi się twoja sztuczka z wieloma liniami. Niestety nie mogę wpaść w taki blok kodu. Jak już wspomniałem w moim pytaniu, potrzebuję dostarczyć moją treść/szablon wewnątrz wyrażenia lambda dostawcy komponentów, aby zbudować kontrolę. Wydaje się to tak proste w kodzie .ASPX. Czy mam przyjąć, że wyrażenia lambda nie są obsługiwane w urządzeniu Razor na tym samym poziomie, co w przypadku kodu MVC .ASPX? –

2

Alternatywnie, można utworzyć funkcję lambda, i nazywają to dla każdej pozycji w organizmie kodzie Razor (idea pochodzi z Andy this post):

@model IEnumerable<Dealer> 

@{ 
    Func<Dealer, object> sayHi = 
     @<text> 
      <b>Hello Dealer named: @(item.DealerName)</b> 
      Multiline support is <em>Beautiful!</em> 
     </text>; 
} 

<div> 
    @foreach(var dealer in Model.ToList()) 
    { 
     sayHi(dealer); 
    } 
</div> 
1

Tak, są one obsługiwane. ALE, Razor ma jakieś dziwne reguły ucieczki, a dodatkowe szelki czasami go dusi, w tym te w rozszerzonych wyrażeniach lambda.

można uprościć @Artioms odpowiedzieć trochę usunąć te dodatkowe szelki z gdzie i ewentualnie wybierz klauzuli

@{ 
    Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      Response.Write(i.DealerName); 
     } 
    }); 
} 

staje

@{ 
    Model.Where(i=>i.DealerName != null).ToList().ForEach(i => 
    { 
      Response.Write(i.DealerName); 
    }); 
} 

Może także stać

@{Model.Where(i=>i.DealerName != null).Select(i=>i.DealerName) 
    .ToList().ForEach(Response.Write);} 

Yay funkcjonalne style!

+0

Dzięki za opinie, ale nie odpowiada na pytanie. –

+0

Zmieniłem definicję góry, aby było nieco bardziej zrozumiałe - poprawia się odpowiedź @Artioms. Dostarczyłem również inne rozwiązanie - usunięcie dodatkowych aparatów, które mogłyby potencjalnie zmylić kompresor. Myślę, że to przydatne, w absolutnym minimum. – scaryman