技術者派遣の技術日誌ブログ

April 22, 2008

ASP.NET MVC の仕組み

Filed under: ALL, Asp.Net — Tags: , — Sayuri @ 10:34 am

ASP.NET MVC Preview 2 はソースコードが公開されています。

 参考:ASP.NET
MVC のソースコードが利用可能に – ScottGuさんのブログ翻訳

このソースコードを参考に、ASP.NET MVC
がどのような仕組みで実現されているかを調べてみました。
まずはリクエストを受けるところから。

  • UrlRoutingModuleがリクエストを受け取る
  • Global.asax.csでRouteの初期化を行うときに設定するMvcRouteHandlerを通して、MvcHandlerが処理を行う対象として設定される

これがまず最初の段階です。
ASP.NET MVC
のサンプルプログラムのweb.configを見ると、UrlRoutingModuleが追加されています。
Moduleはすべてのリクエストを受け取りますので、ここでリクエストを処理するHandlerを新たに設定することで、すべてのリクエストをMvcHandlerが処理するようになります。。
残念ながら
System.Web.Routing.dll
のソースコードは公開されていませんので、その内部での処理は直接見ることはできませんが、まぁ、上記のようになっています。

MvcHandlerはIHttpHandlerを継承していますので、ashxファイルなどと同じようにProcessRequestメソッドが呼び出されることになります。
このあたりはASP.NETの仕組みそのものが利用されています。

さて、ここからは公開されているソースコードで処理を追いかけることができます。

  • MvcHandlerはfactoryパターンを利用してリクエストされているURLに対応するControlerクラスをインスタンス化する
  • Controlerはリフレクションを利用してリクエストされているURLに対応するActionメソッドを呼び出す

このようなかたちでControler内に実装しているActionメソッドが呼び出されます。
ここから先はActionメソッドの実装によって変わってきますが、最初は単純にViewを呼び出す場合をみてみましょう。
この場合はRenderViewメソッドにViewの名称を引数として渡します。

  • RenderViewメソッドは渡された引数をもとに、CreateInstanceFromVirtualPathを利用してPageクラスのインスタンスを生成する

Viewとして作成するaspxはViewPageを継承します。このViewPage自体がPageを継承していますから、ViewというのはViewDataを扱うために拡張されたPageクラスだと思えばいいようです。
このインスタンスに対しても、通常のPageと同じようにPage_Load等の各種イベントが発生します。

次にActionメソッドの中でリクエストされたデータを受け取り、データを更新するような場合はどうなるでしょう。

  • ViewDataにBindingHelperExtensionsクラスのUpdateFromメソッドを利用してデータを埋め込み、更新に必要な処理を行う
  • RedirectToActionメソッドで渡された引数のURLにResponse.Redirectを実行する

データの更新をサポートするためのUpdateFromメソッドはRequest.Formの内容をkeyの名前をもとに、ViewDataの同名のプロパティに埋め込みます。
このため、データ入力用に生成されるHTMLの入力領域には、IDとしてそのデータを埋め込むViewDataのプロパティの名前をつけておく必要があります。

また、RedirectToActionの実態はResponse.Redirectなので、ここでブラウザとの通信が発生し、それにおよってブラウザに表示されるURLがリダイレクト先のActionになります。
データを更新したあとにデータの一覧を表示する、といった場合にこのような動きをさせることになります。

ASP.NET MVC の仕組みの概要としてはこんなところでしょうか。
調べてみると、ASP.NET MVC
ではweb.configへの記述の追加やbinフォルダへのdllの追加はありますが、それらはすべてASP.NETの拡張といったレベルであり、ASP.NETそのものに手を入れている部分はまったくなさそうです。
ASP.NETはもともと柔軟で拡張性を持ったフレームワークなのですが、ASP.NET
MVC はその特徴を十分に活用したサンプルと考えることもできるようです。

April 13, 2008

AJAX UpdatePanel – "Statefull" Control Update Trigger – Joe …

Though I think the UpdatePanel control is AWESOME, my personal preference for AJAX style programming leads me to write more client side code and communicate with the server via JavaScript enabled web service calls. …

Though I think the UpdatePanel control is AWESOME, my personal preference for AJAX style programming leads me to write more client side code and communicate with the server via JavaScript enabled web service calls. …

View original post here:
AJAX UpdatePanel – "Statefull" Control Update Trigger – Joe …

Combining Silverlight and JavaScript – Matt Manela's Blog – Site …

Filed under: Ajax — Tags: , , — citiszo @ 11:49 pm

Matthew Manela’s blog about technology, programming and maybe some other things.

Matthew Manela’s blog about technology, programming and maybe some other things.

Matthew Manela’s blog about technology, programming and maybe some other things.

Matthew Manela’s blog about technology, programming and maybe some other things.

Matthew Manela’s blog about technology, programming and maybe some other things.

Read the original here:
Combining Silverlight and JavaScript – Matt Manela's Blog – Site …

April 12, 2008

[Tips][ASP.NET]ViewStateには何が入ってるのか

Filed under: ALL — Tags: , , — Sayuri @ 11:20 am

ViewStateはASP.NETの便利な機能です。(中には余計と思われる方もいるでしょうけど)
あの中には何が入ってる(保存されている)のでしょうか?
ViewStateに保存されるもの/されないものを理解してうまく付き合って行きましょう。
ViewStateの詳細は次の通りです。

まず、.NETを始めたばかりの人のために、ViewStateとは何ぞや?という話からしましょう。

ViewStateとは
複数のクライアントのラウンドトリップに渡って、そのページ自身の状態を保持するためのASP.NETの機能です。

いまいち良くわかりませんね。具体的な例をあげて説明しましょう。
ここでは説明だけですが、実際にページを作成してみるとわかりやすいでしょう。

例えば、画面上にラベルとボタンが1つずつ存在するページがあるとします。
このページのLoadイベントでは、PostBackでない場合のみ、ラベルに対して「ロードしました。」という文字列
をセットします。ボタンのClickイベントでは、何もしません。

このページをリクエストした場合、表示される画面には、先ほどセットした文字列とボタンが1つ表示されてい
ます。ここからが本番です。では、この状態で画面上のボタンをクリックしたらどうなるでしょうか。

先ほど言ったように、ボタンのClickイベントでは何もしません。(誤解のないように言っておきますが、クリッ
クによってポストバックはします。Clickイベントハンドラに何も記述しないという意味です)
実際にクリックしてみましょう。すると、どうでしょう。「ロードしました。」という文字列はラウンドトリッ
プ後も画面上に表示されています。

これが、ViewStateの機能です。

このようにページの状態を復元するためには、そのための情報をいずれかの場所に保持しておかなければなりま
せん。デフォルトでは、ViewStateはクライアントにページを送信する際、隠しフィールドとして画面自体に状態
情報を埋め込みます。
実際に表示された画面のソースを見てみると、formタグのすぐ下にinputタグがあり、このタグのname属性を見て
みるとname=”__VIEWSTATE”となっているはずです。さらにvalue属性の値を見てみると、何やら暗号化された文字
列のようなものがあると思います。

これは、特に暗号化したデータではなく、単にbase64でエンコードされただけのデータです。
ポストバックが発生した時に、この隠しフィールドのデータを利用して状態を復元します。

誤解を恐れずに言うならば、「ViewStateとは、次にポストされてきたときに前に送信した内容を知るためのデ
ータ格納領域」と言えるでしょう。本当に誤解を恐れずに言うとこんなに簡単に表現できます。

しかし、誤解をされた方もいらっしゃるでしょうから、少し付け加えます。
前に送信した内容を知るためのデータを格納するとは言え、何から何まで格納しているわけではありません。

では、このViewStateにはどのようなデータが格納され、どのようなデータは格納されないのでしょうか。

ViewStateに格納されているもの・されていないもの

わかりやすい例として、テキストボックスを挙げてみたいと思います。

「ViewStateとは」で説明した画面にテキストボックスを2つとボタンを1つ追加したと想定してください。
そして、1つのテキストボックスには何らかのスタイルをデザイナで指定します(BackColorでもBorderColor
でも何でも良いです)。もう1つのテキストボックスはデフォルトのままにしておきましょう。

Loadイベントともとからあるボタンにイベント処理はそのままで良いです。

最後に追加したボタンのイベント処理を実装しましょう。
このイベント処理では、先ほど何も設定しなかったテキストボックスに何らかのスタイルを設定します。

これで準備ができました。ページを実行してみましょう。

まず、1つのテキストボックスにスタイルが設定されており、1つはデフォルトのままです。
では、スタイルを設定したテキストボックスに何らかの文字列を入力して、先ほど追加したボタンをクリックし
てみて下さい。

どうでしょう。
元々スタイルを設定したテキストボックスは、スタイルを維持したまま表示されてますね。
入力した文字列も表示されていると思います。
ボタンクリックイベントでスタイルを設定したテキストボックスはどうでしょう。
もちろん、スタイルが設定されて表示されていると思います。

さぁ、次です。
ではここで、最初からあるボタン(イベントハンドラに何も記述してないボタン)を押したらどうなるでしょうか。

答えは、「ボタンを押す前の状態とまったく同じ画面が表示される。」です。

重複になりますが、これがViewStateの機能です。

では、この画面上の情報のうち、どの情報がViewStateで管理されたものなのでしょうか。
すべてではありません。ViewStateはHTML自体にデータを埋め込むという性質上、必要最低限のデータしか保存
しないようにできています。必要のないものは保存されないのです。
説明をわかり易くするために、「では、さっきの画面では何が必要のない情報だったのか?」という観点で説明
しようと思います。

先ほどの画面で、ViewStateが管理していなかった情報を以下に列挙します。

・デザイナでスタイルを設定したテキストボックスのスタイル情報
・画面表示後、スタイル設定したテキストボックスに入力した文字列

先ほどの画面で、ViewStateが管理していた情報を以下に列挙します。

・ラベルにセットした文字列
・クリックイベントでスタイルを設定したテキストボックスのスタイル情報

※もちろんこれだけではありませんが、説明するにはこれだけ挙げておけば十分なので、あとは省略します。

デザイナでセットしたスタイル、テキストボックスの文字列はなぜViewStateに保存されなかったのでしょうか。
答えは簡単です。デザイナでセットしたスタイルは、デザイン時に生成されたコードに静的に記述されています。
つまり、ページのインスタンスが作成されるタイミングで毎回設定される事になります。よって、ラウンドトリ
ップ間でViewStateを利用しなくてもスタイルは設定されるのです。
テキストボックスの文字列はどうでしょうか。こちらは、わざわざViewStateに保存しなくても、サブミット時
に必ず送信されてきます。よってViewStateに保存する必要はありません。

逆に、ラベルにセットした文字列、イベントハンドラ内で設定したスタイルはインスタンス作成時には設定され
ませんし、送信もされません。よって、ViewStateによる管理が必要という事になります。

このように、ViewStateでは管理する情報と管理しなくても良い情報が切り分けられ、必要最低限のデータ量で
済むように考えられています。但し、設定した場所(デザイナ・コード)によってViewStateに保存されるかどう
かが決まるものもあります。先ほどのスタイルが良い例です。静的なスタイルなら、コードではなくデザイナや
スタイルシートを利用するべきなのは言うまでもありません。

非常に長くなってしまいましたが、あと後少しだけ。

説明で利用したサンプル画面で、本当に説明した通りになっているのかどうかを確認する方法があります。
ページのトレースを有効にして実行することです。
すると、ページ下部にトレース情報が表示されます。ここに「ViewStateサイズのバイト数」という情報が表示
されています。ここを確認すると、デザイナでスタイルを設定したテキストボックスは最初から最後まで、0
(ViewStateにデータは保存されていない事を表す)になっているはずです。
逆に、イベント内でスタイルを設定したテキストボックスは、スタイルを設定した直後から、このバイト数が
増えるはずです。

Tipsというよりは、コラムのようになってしまいましたが、これがどなたかの役に立っているとすれば、非常
に嬉しいことです。

AjaxControlToolkit MaskedEditExtender /CalendarExtender を使用する

Filed under: ALL, Ajax — Tags: , — Sayuri @ 10:15 am


April 9, 2008

Getting IIS 7 to Compress JavaScript – Nick Berardi's Coder Journal

Filed under: IIS, JAVA, Javascript/Xhtml/Css — Tags: , , , , , , — midori @ 5:28 pm

The IIS 7.0 compression works perfectly for CSS, HTML, and Text files, however JavaScript is another story. The JavaScript files on my IIS 7.0 server were not being compressed and served with GZip encoding, which is a major problem for …

The IIS 7.0 compression works perfectly for CSS, HTML, and Text files, however JavaScript is another story. The JavaScript files on my IIS 7.0 server were not being compressed and served with GZip encoding, which is a major problem for …

The IIS 7.0 compression works perfectly for CSS, HTML, and Text files, however JavaScript is another story. The JavaScript files on my IIS 7.0 server were not being compressed and served with GZip encoding, which is a major problem for …

The IIS 7.0 compression works perfectly for CSS, HTML, and Text files, however JavaScript is another story. The JavaScript files on my IIS 7.0 server were not being compressed and served with GZip encoding, which is a major problem for …

The IIS 7.0 compression works perfectly for CSS, HTML, and Text files, however JavaScript is another story. The JavaScript files on my IIS 7.0 server were not being compressed and served with GZip encoding, which is a major problem for …

See the original post here:
Getting IIS 7 to Compress JavaScript – Nick Berardi's Coder Journal

javascript cache problem, solved « Kae Verens

Filed under: Ajax, JAVA — Tags: , , , , , — Shotalow @ 11:22 am

A possible refinement (depending on your js sources) is to add a semicolon on the end of each javascript file contents, for the case where the original doesn’t have it (like if it’s packed) and it runs into the next one.

A possible refinement (depending on your js sources) is to add a semicolon on the end of each javascript file contents, for the case where the original doesn’t have it (like if it’s packed) and it runs into the next one.

A possible refinement (depending on your js sources) is to add a semicolon on the end of each javascript file contents, for the case where the original doesn’t have it (like if it’s packed) and it runs into the next one.

A possible refinement (depending on your js sources) is to add a semicolon on the end of each javascript file contents, for the case where the original doesn’t have it (like if it’s packed) and it runs into the next one. …

A possible refinement (depending on your js sources) is to add a semicolon on the end of each javascript file contents, for the case where the original doesn’t have it (like if it’s packed) and it runs into the next one.

Here is the original post:
javascript cache problem, solved « Kae Verens

April 4, 2008

Displaying SQL Database Data in a DataGrid using LINQ and WCF …

,ASP.NET,JAVASCRIPT,JQUERY

LINQ is a very powerful addition to CSharp and is likely to be a central technique for data retrieval for Silverlight and other .NET technology going forward. The trick to learning LINQ is to find Anders and have him explain it to you

LINQ is a very powerful addition to CSharp and is likely to be a central technique for data retrieval for Silverlight and other .NET technology going forward. The trick to learning LINQ is to find Anders and have him explain it to you. …

Link:
Displaying SQL Database Data in a DataGrid using LINQ and WCF …

April 2, 2008

Django snippets: Ajax progress bar

Filed under: Ajax, Javascript/Xhtml/Css — Tags: , , , , , , — Sayuri @ 8:56 pm

This snippet is an example of an ajax progress bar (using jquery) that you might use in conjunction with http://www.djangosnippets.org/snippets/678/. Generates a uuid and adds X-Progress-ID to the forms action url. …

This snippet is an example of an ajax progress bar (using jquery) that you might use in conjunction with http://www.djangosnippets.org/snippets/678/. Generates a uuid and adds X-Progress-ID to the forms action url. …

See the original post here:
Django snippets: Ajax progress bar

April 1, 2008

Scott Hanselman's Computer Zen – How to set an IIS Application or …

Filed under: ADO.NET, Asp.Net, C# — Tags: , , , , , , , , — Shotalow @ 7:02 pm

,ASP.NET,JAVASCRIPT,JQUERY

NET Framework 3.0″ and make a new ” WCF Service” take a look at the web.config. Note that it’s pretty conventional, and should look like a typical .NET 2.0 ASP.NET application with a few additional. ..

NET Framework 3.0″ and make a new “WCF Service” take a look at the web.config. Note that it’s pretty conventional, and should look like a typical .NET 2.0 ASP.NET application with a few additional. …

See original here:
Scott Hanselman's Computer Zen – How to set an IIS Application or …

このページの上部に戻る

Powered by WordPress