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のバグであると思います。

アップデート:

原因を特定するこの他のSOの質問を見つけました。- ヘッドタグのインラインコード-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 に答える