きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

WebMatrixの発行方法に「ローカルフォルダ」が欲しいと思った件

WebMatrixに発行機能がありますが、「Web配置」か「FTP」しか選択できません。私としてはVisual Studioが持っている発行機能のようにローカルの任意のフォルダに発行できる機能が欲しいです。


「Web配置」はサーバ側での対応が必要ですので*1、サーバが自分のコントロール下に無い場合は使えないかも知れません。私が今回試そうと思った環境もそうでした。


また私の場合、正直なところ『何が発行対象物に含まれるのか/どんな設定で発行されるのか』が解らない状態で、いきなり公開サーバにデプロイというのはあまりやりたく無い、と思う事が多いです。まずは何の影響もないところに発行対象物一式を準備し、精査等のプロセスを経て本番リリースを行うのが望ましい…と思っています。


ASP.NET Web Pagesの場合は事前コンパイルなどは要りませんので、最初は「そのままフォルダをコピーすればOKじゃん♪」と思っていた…のですが、WebMatrixの場合は『発行機能を使うしか依存関係のDLLを引っ張ってくる術が無い』為、それもできませんでした。


とりあえず今回は一旦Visual Studioに持って行ってそちらの機能で依存関係を引っ張ってきて…という手順でやろうと思っていますが、WebMartix単体でやれるといいなぁ、と思います*2

*1:エバンジェリストの物江さんのblog参照:http://blogs.msdn.com/b/osamum/archive/2011/02/08/webmatrix-iis-web.aspx

*2:PHPとかから入る人もそう思うんじゃないかと勝手に思っています。オーサリングツール内臓の自動発行機能を使って実際に客先にデプロイしてる人とか、私の周りではあまり聞かないのですよね

@functionsブロックはとっても強力

昨日ちらっと書きましたが、@functionsブロック*1はその名に反し(?)、単に内部でメソッドを定義するだけのものではありません。


公式?なドキュメントがどれかわからないのですが、きっと限りなく公式に近い(と勝手に思っている)のは以下でしょうか。
http://blogs.msdn.com/b/timlee/archive/2010/07/30/using-functions-in-an-asp-net-page-with-razor-syntax.aspx


また、id:shibayanからもアドバイスを頂きました。

@kiyokura 単純にクラス定義のスコープだと考えてもらえればいいかと。@functions でクラスや enum の定義も出来ます

(via @shibayan on twitter)

どんな感じになっているかは、Razorで記述した.cshtmlファイルがどんな形のオブジェクトになっているかを見ればわかりますね。cshtmlは実行時にC#で記述されたWebPageを継承したクラスに変換されてからコンパイルされるので、その中で@functionsに記述したものを見ると、普通にページクラスのメンバとして展開されていることが割ります*2*3



そういえば@functions、Betaの時に無かった仕様のせいか、「Razor 構文とASP.NET Webページ*4」にも記載されていません。私自身、この構文の存在を知るまでは、ページ内のスコープ((@{}ブロックと@functionsの両方のスコープで有効なメンバをどう定義するか))をどう実現すべきか悩みました。正解は『@functionsに全部書いてしまえ』ってことですね。


P.S.
あと、これ、@functionsって名前はあんまりよくないというか、誤解を受けそう。例えば「@pagelocal」とかの方が良さそうな気がするんですが:P

*1:VBの時は@Functions

*2:実際、これまた昨日、id:shibayan(@shibayan)にアドバイスをしてもらいつつ、razorで記述したcshtmlから作成されたcsファイルを覗いて確認しました。

*3:ちなみに、通常の@{}のブロックに書かれたものは、ページを処理するメソッド内に展開されますので、スコープとしてはその中だけになります。

*4:http://msdn.microsoft.com/ja-jp/asp.net/gg193039

Razorで@functionsブロックを使う

RazorでクラシックASPのページ内サブルーチンを使うのと同じように、ページ内のスコープで有効なメソッドを.cshtmlファイル内に定義したい…と思ったとき、使えるが@functionsブロックです。

たとえばクラシックASPでやっていた

<html>
<body>
  <h1><%= GetName() %></h1>
</body>
</html>
<%
Function GetName()
    GetName = "kiyokura"
End Function
%>

こんな感じのことをやりたいなら、

<html>
<body>
  <h1>@GetName</h1>
</body>
</html>
@functions{
  string GetName(){
    return "kiyokura";
  }
}

という感じでできる。

helperでやるにはなんか違う、クラスを作ってという言うまででもないようなものであれば、十分使える構文だと思います。

ASP.NET WebページでOracle DBを使ってみる


ASP.NET WebページでOracleに接続する方法をちょっと試してみたのでメモ。

考えてみたパターンは以下の四つ。

  • WebMatrix.Data.Databaseを使うパターン
    • [1] System.Data.OracleClientを使う
    • [2] System.Data.OleDb経由でOracle製のOLE DBドライバを使う
    • [3] System.Data.Odbc経由でOracle製のODBCドライバを使う
  • WebMatrix.Data.Databaseを使わないパターン
    • [4] OPD.NETを使う
続きを読む