- PR -

ASP.NET ルーティングのactionを取得する方法

1
投稿者投稿内容
股の下のポニョ
会議室デビュー日: 2008/09/19
投稿数: 7
投稿日時: 2008-12-11 22:38
いつもお世話になります。

どっとねっとふぁんさんのページを参考にルーティングを実装しました。
http://dotnetfan.org/blogs/dotnetfanblog/archive/2008/09/18/2809.aspx

http://localhost/site1/insert/
http://localhost/site1/update/
http://localhost/site1/delete/
のアクセスurlをすべて ~/edit.aspx に割り当てています。

http://localhost/site1/insert/1
のようにアクセスされたとき 1 を取得することはできましたが
insert を取得するにはどのようにすればよろしいでしょうか?

Request.RawUrl で /site1/insert/ を取得して
Request.ApplicationPath で取得した /site1 をとの差分から
insert を判断するのが常套手段でしょうか?

良い方法がありましたら、ご教授お願いいたします。

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-12-12 09:57
ルーティングの定義をどう記述してます?

RouteTable.Routes.Add(new Route("{action}/{id}", new SimpleRouteHandler() { VirtualPath = "~/edit.aspx" }));

もし、上記のように定義しているのであれば、
 SimpleRouteValue.GetRequiredString("action");
でactionの値が取れるはず。。。

#たぶんそういう実装になってると思うけど、違ったかな(w
股の下のポニョ
会議室デビュー日: 2008/09/19
投稿数: 7
投稿日時: 2008-12-12 21:37
どっとねっとふぁん さま

直々にご返答ありがとうございます。

ルーティングの定義は
RouteTable.Routes.Add(new Route("insert/{id}", new SimpleRouteHandler() { VirtualPath = "~/edit.aspx" }));
RouteTable.Routes.Add(new Route("update/{id}", new SimpleRouteHandler() { VirtualPath = "~/edit.aspx" }));
RouteTable.Routes.Add(new Route("delete/{id}", new SimpleRouteHandler() { VirtualPath = "~/edit.aspx" }));
のようになっております。

RouteTable.Routes.Add(new Route("{action}/{id}", new SimpleRouteHandler() { VirtualPath = "~/edit.aspx" }));
と定義すればactionの値がとれるのですが
http://localhost/site1/insert/
http://localhost/site1/update/
http://localhost/site1/delete/
以外に
http://localhost/site1/abc/
とアクセスされたときも edit.aspx に遷移してしまします。

insert、update、deleteのときだけ edit.aspx に遷移させて
actionの値を取得することは可能でしょうか?

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-12-15 11:17
abcにアクセスされたときはどういう動きになればよいのでしょう?
その動きに合わせた設定をあらかじめ入れてしまう、というのが一つの手としてあると思います。

あとはリクエストで受け取ったURLを解析する方法をとるか、ですね。
解析の仕方としては、差分からとるのもありでしょうけど、insert、update、deleteを定義しているので、その3つのうちのどれにあてはまるか、といった形の解析でもいいように思います。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-12-15 17:42
ああ、しばらくさわってなかったんで忘れてた。
Constraintsを設定して使うことが可能です。
具体的には以下のように定義します。

RouteTable.Routes.Add(
 new Route("{action}/{id}",
 null,
 new RouteValueDictionary(new { action = "insert|update|delete" }),
 new SimpleRouteHandler() { VirtualPath = "~/edit.aspx" }));

これで、3番目の引数に設定したinsert、update、deleteという文字列以外のもの、たとえばabcに対しては404エラーが発生するようになります。

なお、2番目の引数(上記ではnull)のところに適切に値を設定すると、idのデフォルト値を設定することができます。
このあたりはRouteTable.Routes.Addメソッドの取り得る引数をいろいろ調べてみてください。
1

スキルアップ/キャリアアップ(JOB@IT)