2010-08-11 19 views
21
<% if(Eval("SaveDate") != DBNull.Value){ %> 
    do magic       
<%} %> 

bana hata veriyor: Eval(), XPath() ve Bind() gibi veri bağlama yöntemleri yalnızca veri birleştirme denetimi bağlamında kullanılabilir.Değerlendirmede if?

Yazabilirim: <% # Eval ("SaveDate")! = DBNull.Value? sihirli yapmak Ama ben ifadesinde bir sürü html büyü yapmam gerekiyor.

Eval'ı kullanmak için # eklemem gerektiğini biliyorum, ancak doğru sözdizimi hakkında emin değilim.

sayfada: Benim sınıfımda

<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %> 

:

protected string GenerateContent() 
{ 
    return "Hello, World!" 
} 

cevap

30

Bir

+0

Bu kodu tekrarlayıcıda kullanıyorum, bu yüzden yer tutucuları veya arkadaki herhangi bir kimliğe sahip kimlikleri kullanamıyorum .. –

+0

FYI: Ekranı kullanamıyorum: none, Google, gösterimde gizlenen metni dizine eklemez. Ben Visible kullanamazsınız = yanlış, bir tekrarlayıcı olarak ve ben kimlik kullanamam .. Ben sadece ifade kullanarak kullanarak gizleyebiliriz .. –

+0

Visible, her sunucu tarafında kontrol bir özellik olabilir. Tekrarlayıcınızın içinde

won't be there!
'yi deneyin; Sayfanızı aradığınızda ve kaynağı görüntülediğinizde, tüm div HTML'den silinmiş olur. – Ruben

8

Genellikle içerik üretmek için kod arkasında bir dize dönen korumalı bir işlev eklemek çözüm, içeriği bir Visat değeriyle bir runat = "sunucu" etiketinde sarmaktır, örneğin,

<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'> 
    do magic 
</div> 

div herhangi bir HTML etiketi olabilir, ancak <asp:Panel> ve <asp:PlaceHolder> da kullanılabilir. "Sihir yapmak" ın hala veriye bağlı olduğunu unutmayın, bu yüzden eğer Eval("SaveDate") == DBNull.Value ise bir hata oluşturabilecek pahalı kod veya kod içeriyorsa mükemmel bir çözüm değildir. Visible="false" etiketi ve oluşturulan HTML tüm içeriğini ihmal edeceğini

Not, işte bu style="display:none" veya style="visible:hidden" çok farklıdır, bu yüzden bu konuda endişelenmeyin anlamına gelir.

Ama eğer senin makul karmaşık, başka oldukça basit bir çözüm (a kesmek biraz) olduğunu "sihirli yapmak": Bir Tekrarlayıcı kullanmak (veya FormView) bir öğenin bir dizi ayarlı onun DataSource ile (görünür) ya da hiçbir öğe (gizli):

<asp:Repeater runat="server" DataSource='<%# ElementIfTrue(Eval("SaveDate") != DBNull.Value) %>' 
    <ItemTemplate> 
     do magic 
    </ItemTemplate> 
</asp:Repeater> 

protected IEnumerable ElementIfTrue(bool condition) 
{ 
    if (condition) 
     return new object[] { Page.GetDataItem() }; 
    else 
     return new object[0]; 
} 

veri kaynağı dizinin asıl içeriğini ya boş (gizli) veya önceden bağlanma edildi öğesi. Bu, ItemTemplate içinde hala <%# Eval(...) %>'u arayabilmenizi sağlar.

Bu yaklaşımla, "sihir yap" ifadeniz yalnızca DataSource bir veya daha fazla öğeye sahipse yürütülecek bir şablondur. Hangi ElementIfTrue tarafından halledilir. Birazcık zihin bükücüsüdür, ama sizi her seferinde bir kez kurtarabilir.

Bir yan not olarak: "sihir" inizi bir kullanıcı denetimine yerleştirmek de karmaşıklığı düşük tutabilir. HTML/ASP.NET etiket karışımınızdaki bir şeyi değiştirmenize gerek yoktur (<%# Eval("...") %> hala kullanıcı kontrolünde bile çalışır).

+1

Eğer html blokları gibi bir çok sihri geri döndürmek istersem .. ve bunun için hala bir yöntem kullanmalı mıyım? –