ASP.NET Web サイトプロジェクト(MVC でない)でも Razor 構文の Web ページ、Web ヘルパーが使用できるということを知ったので、備忘録として書いておきます。
Web サイトプロジェクト(MVC でない)で、ソリューションエクスプローラーから[新しい項目の追加(W)]を選ぶと、上の画像のダイアログが表示され、Razor 構文の Web ページや Web ヘルパーが選択できるのが分かります。(ちなみに、Web アプリケーションプロジェクトでは Razor 関係のメニューは表示されません)
ここで、[ヘルパー(Razor)] をクリックすると、デフォルトで Helper.cshtml という名前のヘルパーが Add_Code フォルダに追加されます。その時同時に、web.config の appSettings 要素に以下の key が追加されます。(何故か、[Web ページ (Razor)]その他ではこの key は追加されません)
<appSettings>
<add key="webpages:Enabled" value="true" />
</appSettings>
MSDN の ASP.NET のフォーラム LoginStatus コントロールで loginUrl が反映されない の原因を調べる過程で分かったことですが、< key="webpages:Enabled" value="true" /> が設定してあると、forms 要素の loginUrl に設定したリダイレクト先(ログインページ)が無視されて、/Account/Login になってしまうという問題があります。
これを回避するためには、以下のように loginUrl キーを appSettings に追加してやります。
<appSettings>
<add key="webpages:Enabled" value="true" />
<add key="loginUrl" value="~/login.aspx" />
</appSettings>
< key="webpages:Enabled" value="true" /> を削除すると、追加した Web ヘルパーのソースの @helper HelperName( ... ) の下に青の波線が出て、"拡張 '.cshtml' に対して登録されたビルド プロバイダーはありません。" というエラーメッセージが表示されます。
でも、自分が試した限りでは、最終的には < key="webpages:Enabled" value="true" /> を削除しても、Razor 構文の Web ページ、Web ヘルパーはビルドでき、問題なく動きました。また、ビルド後は青の波線とエラーメッセージは出なくなりました。
左の画像が、自分が試した結果です。その時に使ったコードを以下にアップしておきます。
ただし、< key="webpages:Enabled" value="true" /> を削除しても、相変わらずログインのリダイレクト先が /Account/Login になってしまいます。
このあたり、訳が分かりませんが、Razor 構文の Web ページを追加すると、< key="webpages:Enabled" value="true" /> がデフォルトで設定されるのではないかと推測しています。(Web ヘルパーだけではデフォルトでは webpages:Enabled の value は ture にならない?)
webpages:Enabled は、MVC 3 Project Upgrade Tool の記事によると、Razor の MVC3 で、"to prevent .cshtml or .vbhtml files in the Views folder from being directly accessible from a web browser" のため、View フォルダの web.config に value="false" として設定するものだそうです。それ以上の説明は見つけられませんでした。
Razor Web ヘルパー (App_Code/QR.cshtml)
@helper GetHtml(string url, int pixelSize=150){
// Google のチャートAPIを使って QR コード ( 二次元バーコード )
// を生成する
string sizeUrl = string.Format("{0}x{0}", pixelSize);
string requestUrl =
string.Format(
"http://chart.apis.google.com/chart?chs={0}&cht=qr&chl={1}",
sizeUrl,
HttpUtility.UrlEncode(url));
<img src="@requestUrl" alt="QR コード" />
}
Razor Web ページ (WebPage.cshtml)
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<p>@QR.GetHtml("http://surferonwww.info/")</p>
</body>
</html>