Problem in Expression tag to bind string variable

2020-02-07 06:01发布

问题:

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();

回答1:

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.



回答2:

You should add runat=server if you want asp.net to evaluate expressions, or it just rendered as you write... so try to add runat=server like this

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