How can I show images using stringbuilder and htmltextwriter?

The following code works to write some HTML for an outpur page I created.  The only factor that seems to be missing in the output are some of my images.  is there a wau to bring in the images as well?
StringBuilder   sb = new StringBuilder ();
                StringWriter    swr = new StringWriter (sb);
                HtmlTextWriter  hwr = new HtmlTextWriter (swr);
                base.Render (hwr);
                string html = sb.ToString ();
                writer.Write (html);

Open in new window

devnewbeeAsked:
Who is Participating?
 
Kelvin McDanielConnect With a Mentor Sr. Developer/ConsultantCommented:
Here's an example of where you would expect many images.
        ArrayList aryImages = new ArrayList();
        aryImages.Add("/files/image1.jpg"); // will be substituted for the "{0}" placeholder
        //... however many you need for your HTML
        aryImages.Add("/files/imageN.jpg"); //matches placeholder "{N}" where N is the count of images.
 
        StringBuilder sb = new StringBuilder();
        sb.Append(string.Format("{whatever_other_html_is_to_be_included}", aryImages.ToArray()));
 
        StringWriter swr = new StringWriter(sb);
        HtmlTextWriter hwr = new HtmlTextWriter(swr);
        base.Render(hwr);
        string html = sb.ToString();
        writer.Write(html);

Open in new window

0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
I assume you mean physical images that exist in the website you're outputting the page for, NOT a binary stream that would be rendered as an image.

You're going to need to make sure the images each have a valid path that is correct for the page you're rendering. For example...

This should work, assuming your images folder is in the root of the website:
sb.Append("<img src=\"/images/image1.jpg\" />");

This will NOT work, because HTML doesn't understand the significance of the tilde:
sb.Append("<img src=\"~/images/image1.jpg\" />");

This should work, assuming your images folder is in the root of the website:
sb.Append("<img src=\"" + ResolveUrl("~/images/image1.jpg") + "\" />");
0
 
devnewbeeAuthor Commented:
So, if I use...

sb.Append("<img src=\"/files/image1.jpg\" />");

this should work?

Where is the stringbuilder syntax exactly do I place it and is there any other syntax required?
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
Kelvin McDanielSr. Developer/ConsultantCommented:
First, I 've got a question for you:

In your sample I don't see where you're actually populating the StringBuilder with your html code; did you simply not include that part in your question snippet? Otherwise, where is it coming from?
0
 
devnewbeeAuthor Commented:
I am overiding the render.  Please see below...

    protected override void Render(HtmlTextWriter writer)


0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
Which is applicable here?

A. The passed in HtmlTextWriter writer already has the HTML you're going to render
- OR -
B. You're going to create the HTML on the fly in your Render() method?
0
 
devnewbeeAuthor Commented:
Its actually based on if the page is a postback and the selected value of a control.
0
 
devnewbeeAuthor Commented:
B. You're going to create the HTML on the fly in your Render() method?
0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
Ok. As long as you're going to have the opportunity to inject the <img> code then this is an easy(ier) thing to do. Back to your first response, yes, the following will work.

sb.Append("<img src=\"/files/image1.jpg\" />");

The StringBuilder syntax that you'll want to use i this case fits in as follows (consider this option #1):

StringBuilder sb = new StringBuilder ();
sb.Append({whatever_other_html_comes_before_the_image});
sb.Append("<img src=\"/files/image1.jpg\" />");
sb.Append({whatever_other_html_comes_after_the_image});
 
StringWriter swr = new StringWriter (sb);
HtmlTextWriter hwr = new HtmlTextWriter (swr);
base.Render (hwr);
string html = sb.ToString ();
writer.Write (html);

Open in new window

0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
Consider this option #2:
(Note: this option assumes only one image will be shown and that it has a place marker of {0} where it is supposed to appear. This can be easily extended to a very large number of images using the basis)
StringBuilder sb = new StringBuilder ();
sb.Append(string.format("{whatever_other_html_is_to_be_included}", "/files/image1.jpg");
 
StringWriter swr = new StringWriter (sb);
HtmlTextWriter hwr = new HtmlTextWriter (swr);
base.Render (hwr);
string html = sb.ToString ();
writer.Write (html);

Open in new window

0
 
devnewbeeAuthor Commented:
Awesome.  Thanks for the help!
0
 
devnewbeeAuthor Commented:
Can you elaborate a little more on the placeholder syntax?
0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
Yep. It goes in order... so you start at {0} where you want the first subsitution to be. The next will be {1}, and the last will be {N} where N is the count of the items minus 1 (because we started at 0).

You MUST has the same number of items to substitutes as you have placeholders, and vice versa.
0
 
devnewbeeAuthor Commented:
So, if I have this right, for three images it would be...just want to clarify.

 ArrayList aryImages = new ArrayList();
        aryImages.Add("/files/bg0.jpg"); // will be substituted for the "{0}" placeholder
        //... however many you need for your HTML
        aryImages.Add("/files/image1.jpg"); //matches placeholder "{N}" where N is the count of images.
         aryImages.Add("/files/footer2.jpg"); //matches placeholder "{N}" where N is the count of images.
 

0
 
Kelvin McDanielSr. Developer/ConsultantCommented:
That is exactly right. In your composite string that the String Builder will eventually contain needs to include {0}, {1}, and {2}... Otherwise you'll get a runtime error.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.