だるろぐ

明日できることは、今日しない。

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 がわかってないな。