Search code examples
asp.netserver-tags

Problem in Expression tag to bind string variable


I am binding path like that in <link> tag

<link rel="stylesheet" media="screen" href='<%= AbsRoot_Path%>UserAccountTemp/css/reset.css' />

but it render like that...

<link rel="stylesheet" media="screen" href="&lt;%= ConfigurationManager.AppSettings[&quot;rootpath&quot;].ToString() %>UserAccountTemp/css/reset.css" />

and it is working <script> tag.

what the reason behind this and what is the solution?

UPDATE

to set AbsRoot_Path

in web.config

<add key="rootpath" value="http://localhost:1259/WallProfile/"/>

and set to AbsRoot_Path

public string AbsRoot_Path = ConfigurationManager.AppSettings["rootpath"].ToString();

Solution

  • EDIT: OK, I'll be more specific here.

    ASP.NET treats <link> inside <head> as a server-side controls even if you didn't specify runat="server" attribute there. So you're actually setting 'href' property of a server-side control, that's why you're getting so strange values there. So the workaround could be either adding id property for the <link> and accessing it server side:

    <link id='lnkStylesheet' rel="stylesheet" media="screen" />
    
    protected void Page_Init(object sender, EventArgs e)
    {
        HtmlLink lnkStylesheet= (HtmlLink)Page.Header.FindControl("lnkStylesheet");
        lnkStylesheet.Href = AbsRoot_Path + "UserAccountTemp/css/reset.css";
    }
    

    or use a solution I provided in my initial answer:

    It seems you define your <link> tag inside a <head> tag and ASP.NET doesn't allow to use server-side constructs there. But there is an easy workaround for this: you could add <link> control programmatically (use HtmlLink server-side control for this):

    protected void Page_Init(object sender, EventArgs e)
    {
        HtmlLink myHtmlLink = new HtmlLink();
        myHtmlLink.Href = AbsRoot_Path + "UserAccountTemp/css/reset.css";
        myHtmlLink.Attributes.Add("rel", "stylesheet");
        myHtmlLink.Attributes.Add("screen", "screen");
    
        Page.Header.Controls.Add(myHtmlLink);
    }
    

    Also defining your AbsRoot_Path variable as ConfigurationManager.AppSettings["rootpath"].ToString() is a little bit redundant because ConfigurationManager.AppSettings["rootpath"] is already of type string.