WebMatrix 3: @ でハマる

執筆日時:

ちょいとログを外部ファイルに吐きたくなって、テキトーにこんなコードを書いてみた。

f:id:daruyanagi:20130929121802p:plain

#App_Code/Logger.cshtml

@helper Write(string message) { System.IO.File.AppendAllText( Server.MapPath("~/log.txt"), string.Format("{0}:\t{1}\r\n", DateTime.Now, message) ); }

これを Default.cshtml でテストしてみた。

f:id:daruyanagi:20130929122015p:plain

@{
Logger.Write("冒頭のコードブロック内で記述");
}

<!DOCTYPE html>

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <meta charset="utf-8" />
        <title>マイ サイトのタイトル</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    </head>
<body>
@Logger.Write("Body 内で記述")
</body>
</html>

結果はというと――

f:id:daruyanagi:20130929122031p:plain

――冒頭のコードブロック内で記述したログは記録されない。「あれ、なんでだろう?」と思って、あちこちごちゃごちゃ弄ってみたのだけど、正解はコレだった。

@{
@Logger.Write("冒頭のコードブロック内で記述");
}

f:id:daruyanagi:20130929122557p:plain

Logger.Write() のまえに @ を足せば実行される。

@{
@(
Logger.Write("冒頭のコードブロック内で記述")
)
}

でもいいのだけど。

しっかし、これ、なぜなんだろう。自分はまだまだ Razor がわかってないな。