0

我正在尝试基于Request.QueryString变量设置我的 css 主题。我用于选择要使用的 Css 主题的代码在函数中,但是该函数被呈现为输出,而不是被评估并呈现输出。

使用<%= GetCssTheme() %>使其呈现为

<link href="Content/<%= GetCssTheme() %>.css" rel="Stylesheet">

但是,如果我使用<%= "" + GetCssTheme() %>它会正确呈现为

<link href="Content/ThemeA.css" rel="Stylesheet">

这是一个说明问题的小示例:

<%@ Page Language="vb" %>

<script language="vbscript" runat="server">
    Public Function GetCssTheme() As String
        Select Case Request.QueryString("SomeValue")
            Case 2
                Return "ThemeB"
            Case 3
                Return "ThemeC"
            Case Else
                Return "ThemeA"
        End Select
    End Function
</script>


<html>
<head runat="server">
    <link href="Content/<%= GetCssTheme() %>.css" rel="Stylesheet" />
</head>
<body>
    Test
</body>
</html>

为什么我需要在我的函数名前面指定一个空白字符串才能使其工作?

我也尝试过其他各种方法:

  • 使用单引号代替双引号

  • 使用<%= GetCssTheme().ToString() %>

  • 使用<% Response.Write(GetCssTheme()) %>

  • 使用

<%
    Dim s as String
    s = GetCssTheme()
    Response.Write(s)
%>

所有这些都错误地呈现 ASP.Net 代码本身,而不是对其进行评估并输出结果。

我尝试过的唯一真正有效的方法是使用内联代码而不是调用函数,或者在函数调用中添加一个空白字符串。

4

2 回答 2

1

问题是因为你的 head 标签上的 runat="server" 。如果你把它拿走,代码就可以正常工作。这似乎是一个老问题......

这个 URL 显示了这个问题,就像我们的对话一直在这个问题上一样,但没有原因。

http://geekswithblogs.net/mnf/archive/2007/11/14/code-render-blocks-not-always-work-inside-server-controls.aspx

因此,如果您的 head 标签上不需要 runat="server",这将解决问题......或者,如果您这样做,您可以始终将 LINK 标签放在不理想的正文开头.

我会继续看,但我认为这要么是其他功能的副作用,要么是 ASP.NET 中的错误。

更新:

我发现this other SO question指定了原因。- 头部标签中的内联代码 - ASP.NET

于 2012-10-12T15:40:47.520 回答
0

基本上发生的事情是 HREF 中的内容是一个字符串,而 GetCssTheme() 就像一个变量。把它想象成当你在代码中做的时候:

Dim s as String = "Some text " & Variable & " more text"
于 2012-10-12T15:48:08.437 回答