Setting imageURL using a function in ASP.NET
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)
{
开发者_StackOverflow 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
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)
.
Your syntax is for data binding, <%# %>. If you are just trying to do inline c#, you should use <%= %>.
I give you another solution. Use ExpressionBuilder :
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 !!!
精彩评论