2009-11-16 16 views
16

Come diavolo chiamo Eval() da codebehind? So che questa è una scorciatoia front-end per qualcosa come DataBinder.Eval (Container.DataItem, "name"), ma non riesco a ottenere questa dannata cosa da compilare. Mi mancano i parametri del metodo corretto, penso. Voglio trasformare qualcosa di simile:Come chiamare Eval in codebehind?

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

in:

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

w/code-behind:

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

L'asp: controllo Image è in un ripetitore che è destinato a a SqlDataReader.

risposta

14

Eval è un metodo su Page (su TemplateControl in realtà, il che significa che è presente anche su UserControl). Quindi non c'è bisogno di passare dei parametri speciali:

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

Attenzione: è possibile chiamare solo Eval mentre l'associazione dati, ma questo è implicitamente nel caso di <%# Eval(...) %> anche, in modo che non dovrebbe costituire un problema.

Se si desidera che l'oggetto reale che stai legame, utilizzare GetDataItem(), come Eval(x) significa fondamentalmente DataBinder.Eval(GetDataItem(), x).

+0

Beh ... duh. Ha funzionato come un fascino! Ho pensato di dover passare in modo specifico il DataItem al metodo, ma mi sbagliavo. – Bryan

3

Hai provato qualcosa di simile:

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

e

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

Questo potrebbe funzionare ottimo, tranne per il fatto che non risponde alla domanda. : P Il punto è che il "nome" cambia in base al codice nel code-behind. – Bryan

+0

Sì, e viene passato come argomento al metodo, quindi la valutazione viene eseguita per prima, quindi viene passata al metodo. Probabilmente ha bisogno di essere lanciato come una stringa, però. – 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

Un altro modo semplice per farlo è quello di utilizzare il sovraccarico di Eval che prende un formato, l'aspx diventa:

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