2011-02-08 25 views
17

Jiletli görüntü motorunda lambda ifadeleri/anonim yöntemler destekleniyor mu? Ben Razor aşağıdaki ifade zorluk yaşıyorumJilet tarafından desteklenen lambda ifadeleri var mı?

:

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

Not: Ben @foreach ile bu çözebilir biliyorum ama bir 3. parti MVC kontrolü için de benzer bir çözüm gerekir. Kontrolün içeriğini ayarlamak için bu mekanizmayı kullanır. MVC .ASPX görünümleri için iyi çalışıyor ancak Razor ile çalışmasını sağlayamıyor.


MVC .aspx eşdeğer (Ben Jilet sözdizimi dönüştürmek istiyoruz kodu):

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

Bu da ASP.NET MVC3 ile gemiler Jilet motoru içindir. Bunun yerine <text>@i.DealerName</text> bloğun

cevap

11

Bir Response.Write(i.DealerName);

sonucu kullanabilirsiniz Bir Jilet sayfasında bu damla sanki aynıdır - açıkçası .. sayfanın oluşturulmasına ederken yürütmek Ve - ben eminim Zaten bunun içine derlenecek olan budur.

Ayrıca, ForEach() geçersiz olduğu için, sayfaya kod bloğu olarak girmeniz gerekir. Yani kod aşağıdaki gibi görünecektir:

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

UPD:
(maalesef burada boyama kod, bu pasajı vermeyecektir: Eğer daha ciddi biçimlendirme varsa
, bu güzel küçük hile için çare olabilir herhangi bir kredi, ama kesinlikle görsel stüdyoda düşürürsen, ne demek istediğimi görürsünüz Not:. Bu sadece Jilet sayfalarında değil, kod dosyalarını :)) çalışacak

@{ 
    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)); 
     } 
    }); 
} 

Umut mantıklı :)

+0

Evet 'Yanıt.Write' çalışır ancak daha karmaşık bir örnek için string birleştirme çabucak elden çıkar. :( –

+0

Evet, haklısın .. Bu işlevin hemen hemen her türlü Jilet koduna izin vermek için gönderiyi güncelledim .. Zevkle :) –

+0

Sorununuz için teşekkürler Artiom'u aldınız. Özellikle çok satırlı numaranı seviyorum. Maalesef böyle bir kod bloğuna giremem. Sorumlulukta bahsettiğim gibi, içeriği oluşturmak için içeriğimi/şablonumu bileşen satıcısı lambda ifadesine dahil etmem gerekiyor. .ASPX kodunda çok basit görünüyor. Ben de ki, bu lambda ifadeleri, Razor'da MVC .ASPX koduyla aynı seviyede desteklenmiyor mu? –

2

Alternatif olarak, bir lambda fonksiyonu oluşturmak ve Jilet kodunun vücutta her öğe için böyle hitap edebilir (Fikir this post yılında Andy geldi):

@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

Evet, onlar desteklenmektedir. AMA, Razor'un bazı garip kaçış kuralları vardır ve ekstra parantezler, genişletilmiş lambda ifadeleri dahil olmak üzere, bazen boğulmasına neden olur. Sen kolaylaştırabilirsiniz

@Artioms bir yerde ve isteğe bağlı olarak seçilmiş bir fıkra ile bu ekstra parantez kaldırmak için biraz cevap

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

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

da olmak Could olur

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

Yay fonksiyonel stiller!

+0

Geri bildirim için teşekkürler ama Bu soruya cevap vermiyor. –

+0

Biraz daha açık olmak için üst reworded - @Artioms yanıtı geliştirir. Ayrıca başka bir geçici çözüm de sağladım - traş makinesi derleyicisini kafa karıştırıcı olabilecek ekstra parantezleri kaldırarak. Bence bence asgari düzeyde faydalıdır. – scaryman

İlgili konular