2

I've done this task before within repeaters and it has worked. However I can't get the below to work for me in a normal webforms page. The images appear as broken links and breakpoints I put in the codebehind are not triggered.

(in the aspx file)

<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl='<%# GetImageDirectory()%>btnRunReport.png'  />

(codebehind)

public string GetImageDirectory()
{
    return "~/App_Variants/LBSX/images/";
}

This is the second method I've tried, in the other one I tried passing the imagename through as a string, and it would return the entire link that way. Still no luck!

Any thoughts?

Thanks!

[EDIT] Thanks for the help everyone. In the end after the handy hints I found a recursive snippet which did the trick as follows:

private void UpdateImages(Control Parent)
{
    foreach (Control c in Parent.Controls)
    {
        ImageButton i = c as ImageButton;
        if (i != null)
        {
            i.ImageUrl = "~/App_Variants/LBSX/images/" + i.ImageUrl;
        }
        if (c.HasControls())
        {
            UpdateImages(c);
        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    UpdateImages(Page);
    ...

Hope it helps someone else.

Cheers

3
  • <%# - call on data-bind event. <%= - call in render (normal usage). you're looking for <%= Commented Jul 19, 2010 at 5:54
  • Yes, sorry I also have tried the <%= but still no breakpoint triggered. What else could I be doing wrong? Commented Jul 19, 2010 at 6:23
  • Also, when I view source on the page, the control shows the src as: src="&lt;%=GetImageDirectory()%20%>" rather than trying to pass whatever it calculates. Maybe there's a clue there Commented Jul 19, 2010 at 6:42

3 Answers 3

6

First, just like Zachary mentioned, you're using the code block for data binding.

Second, as you've already tried, using an inline expression (<%= %>) won't work either in your case, since you can't use an inline expression for any property of a server-tag.

What you could do instead is defining an image button using HTML syntax, omitting the runat="server" tag, and use the inline expression to get your image's URL:

<input type="image" src="<%= GetImageDirectory() %>btnRunReport.png" name="image" />

What an inline expression does is, it calls Response.Write() with the value between <%= %> as the parameter, e.g. <%= this.MyVar %> is Response.Write(this.MyVar).

Sign up to request clarification or add additional context in comments.

4 Comments

Ok, thanks for that. What I'm trying to do is put a custom directory (depending on certain conditions) in front of the image name. So in one case it may be images3/picture.jpg and in others it would be images4/picture.jpg. I'm not using themes for various reasons. Is there any way in the codebehind I could achieve the same by doing something like: First, set imageURL at designtime to 'picture.jpg' without path Then for each Imagebutton in (whatever the page object is) ImageUrl = "mydirectory" + existing imageurl Would that be workable do you think? Thanks for your time!
Thanks to your guidance I've now managed to solve this. Ended up iterating through the controls as mentioned and putting the path at the front. Works a charm! I will add code to the question for others reference.
I'm glad you could solve this. I've managed to write the code for iterating through the controls; if somebody's interested, you can find the mentioned code here: hpaste.org/fastcgi/hpaste.fcgi/view?id=27788#a27788
Thanks for that, much appreciated mate. Note that the one I put above is recursive whereas yours seems to be nested to two levels. Not sure if it ever goes below two levels, mind you... :)
2

Your syntax is for data binding, <%# %>. If you are just trying to do inline c#, you should use <%= %>.

1 Comment

Actually I should have mentioned, I've tried that also and no luck still! Good point though, I did find various people saying that when I was searching forums etc.
1

I give you another solution. Use ExpressionBuilder :

  1. Create a class devired from ExpressionBuilder and override function GetCodeExpression

     namespace your.namespace
    {
    public class CustomBuilder : ExpressionBuilder
    {
        public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
        {
            Type type1 = entry.DeclaringType;
            PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name];
            CodeExpression[] expressionArray1 = new CodeExpression[1];
            expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim());
    
            String temp = entry.Expression;
            return new CodeCastExpression(descriptor1.PropertyType, new CodeMethodInvokeExpression(new
           CodeTypeReferenceExpression(base.GetType()), "GenerateLink", expressionArray1));
        }
        public static  String GenerateLink(String link)
        {
            return ConfigurationManager.AppSettings["MediaPath"] + link + "?ver=" + ConfigurationManager.AppSettings["MediaCode"];
        }
    }
    }
    

expressionArray1 is the input array for GenerateLink function. You can change the size of array according to numbers of input params for your function

2.Register your expression in webconfig

<system.web>
    <compilation debug="true" targetFramework="4.0" >
      <expressionBuilders>

        <add expressionPrefix="GenLink" type="your.namespace.CustomBuilder"/>
      </expressionBuilders>

    </compilation>

3.In view your can use new expression:

<asp:ImageButton ID="ImageButton1" runat="Server" ImageUrl='<%$ GenLink:images/magnifier.jpg %>'/>

4.Enjoy !!!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.