質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

8121閲覧

ASP.netのlinkタグのインライン式が文字列になる

katousan

総合スコア8

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2018/08/07 08:50

編集2018/08/08 01:48

ASP.netのaspxファイルで、CSSをlinkタグで読み込んでいます。
しかし、インライン式の部分にvb.netで宣言されたパブリック変数を入れたいのですが、
そのまま文字列として出力されてしまいます。
この解決方法、原因、公式サイトでの説明等ありませんでしょうか?

宜しくお願い致します。

【環境】
windows10
IIS10.0
.NET Framework 4.5
Visual Studio Professional 2013 Version 12.0

【現象1】
・linkタグのインライン式が文字列で出力されます。
・scriptタグの場合は期待通りに出力されます。
■vb.net
Public strVal As String = "012345"
■ASP.NETファイル

<script type="text/javascript" src="Script/test.js?**<%=strVal%>**"></script> <link href="Style/test.css?**<%=strVal%>**" rel="stylesheet" type="text/css" /> ■出力 <script type="text/javascript" src="Script/test.js?**012345**"></script> ←変数が出力される <link href="Style/test.css?**<%=strVal%>**" rel="stylesheet" type="text/css" /> ←文字列のまま出力される

【現象2】
・linkタグのインライン式の直後に「""」を挿入すると、「""」も出力されますが、パブリック変数の値は正しく出力されます。
■vb.net
Public strValAs String = "012345"
■ASP.NETファイル
ダブルクォーテーションを2つ付加する

<link href="Style/test.css?<%=strVal%>"**""** rel="stylesheet" type="text/css" /> ■出力 変数が出力されるがダブルクォーテーションが付加されたまま <link href="Style/test.css?**012345**" **""** rel="stylesheet" type="text/css" />

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/07 09:50

自分の開発環境(OS, .NET, IIS, Visual Studio のバージョンなど)は書けませんか?
guest

回答1

0

ベストアンサー

質問に対する私のコメント、

自分の開発環境(OS, .NET, IIS, Visual Studio のバージョンなど)は書けませんか?

に反応がないので、質問者さんの環境も私の環境とほぼ同じだろうと想像してレスしておきます。

link 要素は runat="server" を付けなくてもサーバーコントロールと同じ扱いになるようです。

そのことを書いた Microsoft の公式文書は見つけられていませんが、サーバーコントロールでしか使えないはずの ~ 演算子(ルート演算子)が href 属性に使えることなどがそれを裏付けていると思います。stackoverflow にもそのことについて述べている記事があります。

Inline code in head tag - ASP.NET
https://stackoverflow.com/questions/8104268/inline-code-in-head-tag-asp-net

そして、上に紹介した記事にも書いてありますが、href="xxxxxx ..." とすると、xxxxxx ... は文字列として認識され、その中にコードブロック <%= %> を記述しても文字列の一部としてみなされるということのようです。(<%= %> はレンダリングされる際に HtmlEncode, UrlEncode されますが)

質問者さんが試した「ダブルクォーテーションを2つ付加する」と何故コードブロック <%= %> が認識されるのかのメカニズムは分かりませんが、想定外のことをして想定外の結果になったということではないかと思います。(思うだけで確証はありませんが)

で、解決策ですが、href="<%= ... %>" と書くとコードブロックだと認識するようで、例えば以下のようにすれば、【訂正】間違いでした。下の【訂正 2018/8/8 11:27】を見てください。

<link href="<%= "/Content/Site.css?" + strVal %>" rel="stylesheet" /> <link href="<%= ResolveUrl("~/Content/Site.css?") + strVal %>" rel="stylesheet" />

結果は以下のようになるはずです。

<link href="/Content/Site.css?012345" rel="stylesheet" /> <link href="/Content/Site.css?012345" rel="stylesheet" />

Windows 10, .NET 4.6.1, ローカル IIS10、Visual Studio Community 2015 で確認しました。質門者さんの環境で確認してみてください。

本題とは直接関係ないですが、データバインド式を使った場合でも似たようなことがあります。参考までにその関係の記事を紹介しておきます。

データバインド式
http://surferonwww.info/BlogEngine/post/2010/08/17/Data-bind-method.aspx

【訂正 2018/8/8 11:27】

上の回答で「href="<%= ... %>" と書くとコードブロックだと認識するようで」と書きましたが、そうではなくて、href="<%= ... %>" 中の ... でダブルクォートを使った影響でした。

例えば、コードビハインドで、

protected string cssPath = "/Content/Site.css?012345";

として、以下のようにすると、

<link href="<%= cssPath %>" rel="stylesheet" />

<%= cssPath %> は文字列と認識されダメです。以下のようにダブルクォートを使って空の文字列を入れると、

<link href="<%= "" + cssPath %>" rel="stylesheet" />

以下の通り望む結果が得られました。

<link href="/Content/Site.css?012345" rel="stylesheet" />

そのことは上に紹介した stackoverflow の記事にも書いてありました。ただ、strange だそうで、そのメカニズムは不明ですが。

投稿2018/08/08 01:45

編集2018/08/08 02:30
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katousan

2018/08/08 02:01

ご回答ありがとうございます。 助かりました。早速試してみて、うまくいきました!! また、環境の記載が遅れ、申し訳ありませんでした。
退会済みユーザー

退会済みユーザー

2018/08/08 02:11

レスが行き違いになりました。質問者さんの VS2013 と自分の VS2015 の違いは、コンパイラが VS2015 では Roslyn になったということがあります・・・が、それの影響はないようですね。 あと、「href="<%= ... %>" と書くとコードブロックだと認識するようで」と書きましたが、そうではなくて、その中の ... でダブルクォートを使った影響でした。上の回答は訂正しておきます。
katousan

2018/08/08 03:14

再度ご回答ありがとうございます。 やはり、ダブルクォーテーションの影響なのですね。 教えていただいたstackoverflowのサイトの記載の通り試してみたところ、 下記のやり方が成功しました。 <link href="Style/test.css?<%=strVal%>" rel="stylesheet" type="text/css" /> 質問に記載していなかったのですが、<head runat="server">となっていたことが原因だったようです。 この「runat="server"」を取り除くことで、期待通りレンダリングされるようになりました。 情報が少ない中調査していただき、ありがとうございました。 --失敗---------------------------------------- <head runat="server">   <link href="Style/test.css?<%=strVal%>" rel="stylesheet" type="text/css" /> <head> --成功---------------------------------------- <head>   <link href="Style/test.css?<%=strVal%>" rel="stylesheet" type="text/css" /> <head> -----------------------------------------------
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問