2009-11-16 2 views
16

Как я называю Eval() от codebehind? Я знаю, что это интерфейсный ярлык для чего-то вроде DataBinder.Eval (Container.DataItem, «name»), но я не могу получить эту чертову вещь для компиляции. Думаю, у меня отсутствуют подходящие параметры метода. Я хочу, чтобы включить что-то вроде этого:Как позвонить в Eval in codebehind?

<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"); 
} 

аспида: Управление изображения в ретранслятор, который связан с SqlDataReader.

ответ

14

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

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

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

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

+0

Ну ... дух. Работал как шарм! Я думал наверняка, что мне нужно будет передать DataItem методу, но я ошибся. – Bryan

3

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

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

и

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

Это будет работать отлично подходит для того, что он не отвечает на вопрос, за исключением. : P Все дело в том, что «имя» изменяется в зависимости от кода в коде. – Bryan

+0

Да, и он передается в качестве аргумента для метода, поэтому сначала выполняется оценка, затем он передается вашему методу. Скорее всего, нужно нарисовать как строку. – 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 становится:

<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# Eval("name", "some/logical/path/{0}") %>'/> 
Смежные вопросы