2009-11-16 16 views
16

Jak do cholery zadzwonić do Eval() z codebehind? Wiem, że jest to skrót do przodu dla czegoś jak DataBinder.Eval (Container.DataItem, "name"), ale nie mogę dostać tego cholerstwa do kompilacji. Brakuje właściwych parametrów metody, jak sądzę. Chcę włączyć coś takiego:Jak wywołać Eval w codebehind?

<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# Eval("name") %>'/> 

do:

<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# GetImagePath(???) %>'/> 

w/kodu źródłowego:

protected string GetImagePath(????) 
{ 
    //some code 
    return "some/logical/path" + Eval("name"); 
} 

Asp: sterowanie Obraz jest powielacz, który jest związany SqlDataReader.

Odpowiedz

14

Eval jest metodą na Page (na TemplateControl faktycznie, co oznacza, że ​​jest to również obecny na UserControl). Więc nie trzeba przechodzić żadnych specjalnych parametrów:

protected string GetImagePath() 
{ 
    //some code 
    return "some/logical/path" + Eval("name"); 
} 

Uwaga: Można dzwonić tylko Eval podczas wiązania z danymi, ale to niejawnie w przypadku <%# Eval(...) %> też tak, że nie powinno stanowić problemu.

Jeśli chcesz, aby rzeczywisty obiekt, do którego się zobowiązujesz, użyj GetDataItem(), jako Eval(x) w zasadzie oznacza DataBinder.Eval(GetDataItem(), x).

+0

Cóż ... duh. Pracował jak urok! Myślałem, że na pewno będę musiał przekazać DataItem do metody, ale myliłem się. – Bryan

3

Próbowałeś coś takiego:

<asp:Image ID="imgLogo" runat="server' ImageUrl='<%# GetImagePath(Convert.ToString(Eval("name"))) %>' /> 

i

protected string GetImagePath(string image) 
{ 
    return "some/logical/path/" + image; 
} 
+0

Byłoby doskonale z wyjątkiem faktu, że to nie jest odpowiedź na pytanie. : P Chodzi o to, że "nazwa" zmienia się w zależności od kodu z tyłu kodu. – Bryan

+0

Tak, i jest przekazywana jako argument do metody, więc ocena jest wykonywana w pierwszej kolejności, a następnie jest przekazywana do twojej metody. Prawdopodobnie jednak należy go rzucić jako ciąg. – tvanfosson

4
protected void rProducts_ItemDataBound(object sender, RepeaterItemEventArgs e) { 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) { 

     Image ProductImage = (Image)e.Item.FindControl("ProductImage"); 
     ProductImage.ImageUrl = DataBinder.Eval(e.Item.DataItem, "ProductImageUrl"); 

     // Or strongly typed 
     Product product = (Product)e.Item.DataItem; 
     ProductImage.ImageUrl = product.ProductImageUrl; 
    } 
} 
2

Innym prostym sposobem na to jest użycie przeciążenie Eval że trwa formatu, aspx staje:

<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# Eval("name", "some/logical/path/{0}") %>'/>