views:

607

answers:

4

How the heck do I call Eval() from codebehind? I know this is a front-end shortcut for something like DataBinder.Eval(Container.DataItem, "name"), but I cannot get this damn thing to compile. I am missing the proper method parameters, I think. I want to turn something like this:

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

into:

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

w/ code-behind:

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

The asp:Image control is in a repeater that is bound to a SqlDataReader.

+1  A: 

Have you tried something like:

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

and

protected string GetImagePath( string image )
{
    return "some/logical/path/" + image;
}
tvanfosson
This would work great except for the fact that it doesn't answer the question. :P The whole point is that "name" changes based on the code in the code-behind.
Bryan
Yes, and it's passed in as an argument to the method so the evaluation is done first, then it is passed to your method. Probably needs to be cast as a string, though.
tvanfosson
+1  A: 
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;
    }
}
John Sheehan
+2  A: 

Eval is a method on Page (on TemplateControl actually, which means that it's also present on UserControl). So you don't need to pass any special parameters:

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

Caution: you can only call Eval while databinding, but that's implicitly the case for <%# Eval(...) %> too, so that shouldn't pose a problem.

If you want the actual object you're binding to, use GetDataItem(), as Eval(x) basically means DataBinder.Eval(GetDataItem(), x).

Ruben
Well... duh. Worked like a charm! I thought for sure I'd have to specifically pass the DataItem to the method, but I was wrong.
Bryan
A: 

Another simple way to do this is to use the overload of Eval that takes a format, the aspx becomes:

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