如何在后台代码中调用Eval函数?

18

我应该如何从代码后台调用Eval()函数?我知道这是一种前端的快捷方式,类似于DataBinder.Eval(Container.DataItem, "name"),但我无法让它编译通过。我认为我缺少了正确的方法参数。 我想将以下内容转换为:

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

转换为:

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

使用代码后端:

protected string GetImagePath(????)
{
    //some code
    return "some/logical/path" + Eval("name");
}
< p > asp:Image控件在一个绑定到SqlDataReader的Repeater中。 < /p >
4个回答

16

EvalPage上的方法(实际上在TemplateControl上,这意味着它也存在于UserControl上)。因此,您不需要传递任何特殊参数:

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

注意:只能在数据绑定时调用Eval,但对于<%# Eval(...) %>而言,这是隐含的,所以不应该有问题。

如果您想要绑定的实际对象,请使用GetDataItem(),因为Eval(x)基本上意味着DataBinder.Eval(GetDataItem(), x)


好啊...哎呀。 真是太棒了! 我本以为我必须特别传递DataItem到方法中,但我错了。 - Bryan

5

你尝试过这样做吗:

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

并且

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

这个方案很好,但事实上它并没有回答问题。 :P 整个重点在于“名称”根据代码后台中的代码而变化。 - Bryan
是的,它作为参数传递给方法,因此首先进行评估,然后传递给您的方法。不过可能需要将其转换为字符串。 - 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
另一种简单的方法是使用带有格式的Eval重载,aspx变为: ```html 另一种简单的方法是使用带有格式的Eval重载,aspx变为: ```
<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# Eval("name", "some/logical/path/{0}") %>'/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接