Как позвонить в Eval в коде позади? - PullRequest
17 голосов
/ 17 ноября 2009

Как, черт возьми, я вызываю Eval () из codebehind? Я знаю, что это внешний интерфейс для чего-то вроде 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");
}

Элемент управления asp: Image находится в повторителе, который связан с SqlDataReader.

Ответы [ 4 ]

15 голосов
/ 17 ноября 2009

Eval - это метод на Page (на самом деле TemplateControl, что означает, что он также присутствует на UserControl). Таким образом, вам не нужно передавать какие-либо специальные параметры:

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

Внимание: вы можете вызывать Eval только при привязке данных, но это неявно относится и к <%# Eval(...) %>, так что это не должно вызывать проблем.

Если вам нужен фактический объект, к которому вы привязываете, используйте GetDataItem(), так как Eval(x) в основном означает DataBinder.Eval(GetDataItem(), x).

4 голосов
/ 17 ноября 2009
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;
    }
}
4 голосов
/ 17 ноября 2009

Вы пробовали что-то вроде:

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

и

protected string GetImagePath( string image )
{
    return "some/logical/path/" + image;
}
2 голосов
/ 17 ноября 2009

Другой простой способ сделать это - использовать перегрузку Eval, которая принимает формат, aspx становится:

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