[c#]aspx页面表达式不解析直接输出的解决方法

问题描述

在写Rouse CMS系统时遇到问题:

1、在head在runat="server"模式下使用含ConfigurationManager的表达式能够取得正确值,如下例:

<head runat="server">
<title>用户登陆</title>
<link rel="stylesheet" href="<%=ConfigurationManager.AppSettings["SJ_WebUrl"].ToString() %>/common/css/sjnet.css" type="text/css"/>
</head>

结果:
<head >
<title>用户登陆</title>
<link rel="stylesheet" href="
http://localhost:49249/sjnet/common/css/sjnet.css" type="text/css"/>
</head>

而使用其他方法则无法取得正确值,如下例:

<head runat="server">
<title>用户登陆</title>
<link rel="stylesheet" href="<%=SJNet.common.GlobalMethod.getAppPath(Request) %>/common/css/sjnet.css" type="text/css"/>
</head>

结果:
<head><title>
用户登陆
</title><link rel="stylesheet" href="&lt;%=SJNet.common.GlobalMethod.getAppPath(Request) %>/common/css/sjnet.css" type="text/css" /></head>

解决方案一:

保留head 的 runat="server" (因在CMS系统正文页面需要在.cs文件中修改Title中), 将href右边的双引号或单引号去除则能正常处理,即:
<head runat="server">
<title>用户登陆</title>
<link rel="stylesheet" href=<%=SJNet.common.GlobalMethod.getAppPath(Request) %>/common/css/sjnet.css type="text/css"/>
</head>

结果:
<head >
<title>用户登陆</title>
<link rel="stylesheet" href=
http://localhost:49249/sjnet/common/css/sjnet.css type="text/css"/>
</head>

解决方案二:

去除head标签中的runat="server",即:
<head >
<title>用户登陆</title>
<link rel="stylesheet" href="<%=SJNet.common.GlobalMethod.getAppPath(Request) %>/common/css/sjnet.css" type="text/css"/>
</head>

结果:
<head >
<title>用户登陆</title>
<link rel="stylesheet" href="
http://localhost:49249/sjnet/common/css/sjnet.css" type="text/css"/>
</head>

下附网文《ASP.NET中aspx页面runat=”server”的本质》(作者:volnet / www.cnblogs.com的结论:

结论

在runat=”server”下的标签,如果可以转换成HtmlControl,那么它的Attribute将不能使用<%=str%>的方式输出,如果不能转换成HtmlControl,则没有具体要求。

如果一定要使用<%=str%>的方式,则需要将其以及它的祖先节点上的runat=”server”去掉即可。

但是,关于一个嵌套的结构是否会被自动提升为runat=”server”则是根据标准来制定的。

比如将link标签放在head中,设置head为runat=”server”,则link会被转换成HtmlLink,但是将其放在<form runat=”server”>下则只会被当作文本输出。

而在form下的控件则不会进行自动提升,如<form runat=”server”><input type=”button” /></form>则button将继续以文本的方式输出,遇到<%=str%>将被转换成__w.Write(str);。

如果需要将其提升为HtmlButton控件,将显示指定其为<input runat=”server” type=”button” />。


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。