如何在代码隐藏中调用Eval?

问题描述 投票:0回答:5

我到底如何从代码隐藏中调用 Eval() ? 我知道这是 DataBinder.Eval(Container.DataItem, "name") 之类的前端快捷方式,但我无法编译这个该死的东西。 我认为我缺少正确的方法参数。 我想变成这样:

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

进入:

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

w/代码隐藏:

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

asp:Image 控件位于绑定到 SqlDataReader 的转发器中。

asp.net .net data-binding eval
5个回答
17
投票

Eval
Page
上的一个方法(实际上是在
TemplateControl
上,这意味着它也存在于
UserControl
上)。所以你不需要传递任何特殊参数:

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

注意:数据绑定时只能调用

Eval
,但
<%# Eval(...) %>
也隐含这种情况,所以这不会造成问题。

如果您想要绑定到的实际对象,请使用

GetDataItem()
,因为
Eval(x)
基本上意味着
DataBinder.Eval(GetDataItem(), x)


5
投票

你有没有尝试过类似的事情:

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

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

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 变为:

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

0
投票

Ruben 的答案有效,但如果您需要包含一些

????
的参数,并且想避免调用
Eval
,这里是更完整的答案。

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

背后的代码:

protected string GetImagePath(string someDataHere)
{
    object dataItem = null;
    try
    {
        dataItem = Page.GetDataItem();
    }
    catch (InvalidOperationException ex) // Thrown when the control is not data bound
    {
        return null;
    }

    string name = DataBinder.Eval(dataItem, "name").ToString();
    return "some/logical/path/" + someDataHere + "/" + name;
}
© www.soinside.com 2019 - 2024. All rights reserved.