2008年5月28日水曜日

Preview3!!!

やっと出た~!!

ASP.NET MVC Preview 3 Release - ScottGu's Blog ASP.NET - Release: ASP.NET MVC Preview 3 Source Download details: ASP.NET MVC Preview 3

Northwind使ったサンプルプロジェクトも出てるけど。 Updated Northwind Demo For ASP.NET MVC Preview 3 このままじゃなんかエラーで動かない!

と、コメントに書いてる人もいて、同じくアセンブリをいったん削除(System.Web.Abstractions,Mvc,Routhing)してから、Program Filesに入ったDLLを参照で追加すると動いた。 ソースも即行ダウンロードしたけど、どこがどれだけ変わったのやら。 とりあえず、Preview3 Readme.docを見たけど、もっとこう細かいところの一覧とかも欲しかったりする。わがままですね。

でも、HtmlヘルパーのDropDownList(ListBoxも)がMultiSelectListを渡すようになって、ちょっと良くなったのはいいけどRadioButtonListは相変わらずstring[]を返すんだね。結果に対するAggregateによる生成はどうなんでしょうね。いいんですかね。

あと、せっかくだから(最近ドはまり気味の)RESTfulなサンプルにしてほしかったりするな~。 URIは名詞で!統一インターフェースで! あと、個人的にかなりショッキングなのがViewDataのModelプロパティ...。同じ名前でプロパティを定義するようにしてたからっていうね。悲しいね。

ソース見てて思ったけど、あれだね、カスタムViewDataと、標準ViewDataの両方がViewにわたるんだね。標準ViewDataのModelプロパティにカスタムViewDataが入ってる(カスタムとか標準って言い方をしないよね、きっと)。この辺の変更でHtmlヘルパーのデフォルト値指定が楽になるみたい。 これは素敵かもしれない。TempDataは相変わらずSessionなのがちょっと残念。 CopyToは同じの作ってたから、最初から欲しかったので最高! あとは、いじりつつ確認するぞ~!! ※416からでもずいぶん違うのね...。

2008年5月20日火曜日

ひた隠しに

動くものを作ろうと思うと、やっぱり流行りのスタイルに乗っかりたい。そう思うのは浅はかなことでしょうか。で、ASP.NET MVCでRESTfulっぽく作るならやっぱり、HTTP MethodでActionを自動で振り分けたい。 そう思うのは、いたしかたなし。

画像を操作するResourceControllerがあったとしましょう。 画像を追加したいならResourceControllerにPhotoAddNewとかPhotoCreateなんていうActionを作りたくなるでしょう。でも待って!それじゃRESTfulじゃないよ!

複数形とか単数形は置いといて、とりあえず/Photoに対するアクセスでCRUDを処理したいよね! 特に興味無いですか?あ、そうですか。

まぁ、聞いて下さいよ。 以前のエントリーでRESTfulFilterなんてものを書いてみましたが、ぶっちゃけあれじゃ効率悪し。 送り側にActionFilterAttributeを書く方法だと、毎回リクレクションが必要ジャン? それなら、受け側でHTTP Method毎のAction名を指定するほうがよっぽど効率がいいってものですよ。 その辺踏まえて、以下のようなActionに。

/ResourceController [RESTfulFilter] public void Photo(int? id){...} public void PhotoPost(){...} public void PhotoPut(int id){...} public void PhotoDelete(int id){...} ※ActionResultじゃなくてvoidなのは気にしない。

で、 RESTfulFilterのExecutingでHTTP Method見て、現在のAction名の後ろに自動でInvokeActionする名前を作る(もちろん、属性のパラーメータでHTTP Method毎のAction名をセットできるようにした方が優しい)。 こんな風にしとけば、ActionFilterAttributeは1か所に指定するだけで済むので、効率よしって話です。 が、その他のActionがpublic(じゃないと、InvokeAction出来ない、よね?)なので、直接そのActionにもアクセスできちゃうのが何か気持ち悪し。出来て何が悪いってわけじゃ全然ないんだけども。なんとなく。直接のアクセスは拒否したいな、なんて思ったり思わなかったり。

そんなときはまたしてもActionFilterAttribute作成しましょう。 たとえば...RequireReactionAttributeとかって言う名前で。 RESTfulFilter でInvokeActionする直前に、Controllerのプロパティで例えばIsReaction = tureとかしておけば、その先でIsReactionがfalseなら実行をキャンセル(filterContext.Cancel=true)にしちゃう。そうしとけば直接アクセスしてほしくないActionに制限かけれたり(Controllerのbaseプロパティで分かる方法あるのかな)。 同じく、RequireAjaxAttributeとかって言うのも作っちゃって、XmlHtpRequest以外の要求は拒否(リクエストヘッダに何か入れとく)なんてことも、簡単(ヘッダ書き換えできちゃうから完璧なわけじゃないけど)。 prototype.jsなら勝手にヘッダーに入れてくれて楽ちんだし、DELETEやPUTのときには_methodにHTTP Method入れてPOSTにするから、そこ見て判定するようにしとくと、さらに楽ちん。

まだまだ工夫の余地ありだけど、HTTP Methodの自動InvokeActionだけでも、だいぶコード量削減出来てうれしい限りです。

2026年06月16日の記事一覧

(全 23 件) そうきたか。マイクロソフトが新しく提案するAI搭載の「社員証」 「WSL」のバージョン3が開発者にもたらす大きなメリット Stack Overflow、AIエージェント同士が掲示板で技術情報を共有する「Stack Overflow fo...