既存の ASP.NET アプリケーションを ASP.NET MVC パターン形式に移行したいと考えています。どのような手続きをすればよいですか?ステップバイステップの手順は非常に役立ちます。
4 に答える
これらは、従来の ASP.Net Webforms から ASP.Net MVC に移行する際に会社で行った手順に基づいた、段階的なガイドです。サイトのサイズのために段階的にこれを行う必要があるため、完全ではなく、まだ進行中ですが、おそらく他の誰かが私たちの結果に基づいて改善された回答を見つけて提出するでしょう.
段階: 1. 計画 - ASP.Net の Web フォームから MVC に移行するには、慎重な計画が必要です。私たちがこの動きで犯した過ちは、計画のこの段階にはルート計画とモデル/コントローラー/アクション計画という 2 つの側面があることを認識していないことです。これを行わないと、サイトの機能を拡張したり、より複雑な移行を行ったりするときに、後で深刻な問題が発生します。
ヒント: - 現在のサイトマップを見て、ASP.Net MVC アプリケーションで使用できるように、改善されたサイトマップ/ディレクトリ構造を設計してください。Web サイトの「言語」を把握します。たとえば、ASP.Net MVC のデフォルトの動作はhttp://sitename/ {controller}/{action}/{id} の動作ですが、必要に応じてこれをオーバーライドできます。ルーティング ルールのハッキングの経験が増える。
デフォルトでは、各 Controller はアプリケーションの仮想サブディレクトリ経由でルーティングされることに注意してください。たとえば、http://sitename/Xは XController (およびデフォルトではその Index メソッド) にルーティングされ、http://sitename/Y/Getは次の場所にルーティングされます。 YController の Get() メソッド。これは好きなように変更できます (ルーティングは非常に強力です) が、それはこの回答の範囲を超えています。
既存のサイトマップを使用して、現在の各 .aspx ページが配置される MVC 構造内のフォルダーを指定します (もちろん、最初にそのページが存在するかどうかを確認します)。
スクリプト、画像などが一緒に保存されていない場合、または各サブディレクトリ内の「予約済みの名前」フォルダーに保存されていない場合は、再設計するときにそうすることを検討してください。これは、Global.aspx.cs ファイルで Map.IgnoreRoute() ルーティング ルール コマンドを使用してこれらのフォルダーの処理をルートとしてバイパスできるようにすることで、設計を大幅に簡素化するためです。
私たちの場合、現在のサイトの実際のサブディレクトリ レイアウトをミラーリングし、各サブディレクトリがコントローラーになりました。たとえば、/Account には AccountController があり、/X には XController があります。そこに落ちたすべてのページは、各コントローラー内のアクションに置き換えられました。たとえば、 http://sitename/profile/about.aspxはhttp://sitename/profile/aboutになり、profileController 内の「about」ActionResult メソッドにマップされました。これにより、サイト全体を一度に移行するのではなく、一連のスプリントで 1 つまたは 2 つのディレクトリ (または 1 つのディレクトリ内の複数のファイル) を部分的に移行することで、機敏性を維持できます。
Visual Studio で新しい ASP.Net MVC アプリケーションを作成し、現在のサイトに存在するフォルダーのルーティング規則を無視する規則を Global.asax ファイルにすぐに作成します。
ASP.Net Web アプリケーションのフォルダーを ASP.Net MVC アプリケーション フォルダーにコピーします。Web サイトを実行し、正常に動作することを確認します (ルーティング ルールがまだ使用されていないため、正常に動作するはずです)。
移行するサブディレクトリまたはサブディレクトリ内のファイルのサブセットを選択します。
このサブディレクトリ内の各 .aspx ページに対して:
a. 最初にビューを作成します。私は、Web ブラウザーでレンダリングされたバージョンのページをベース HTML として使用し、動的データで満たされていることがわかっている場所にプレースホルダーを配置する傾向があります。
b. 動的データのプレースホルダーを使用して、単純なデータ型を使用してモデルの最初のドラフトを作成します。このモデルは単純なものから始めますが、元のサイトからより多くのページを移行するにつれて常にリファクタリングされるため、少し重く見えても心配する必要はありません。1 つのモデルに好みのプロパティが多すぎることに気付いた場合、またはアイテムの特定のサブセットのモデルだけを超えた論理的なグループ化が見られた場合、おそらくこれは、モデルをリファクタリングして、これらの単純なデータの代わりにオブジェクトを持たせる必要があることを示しています。プロパティとしての型ですが、ビジネス ロジック レイヤーで構成されます。
c. コントローラーがまだ作成されていない場合は作成し、計画で決定した Action に適切な ActionResult メソッドを配置して、このビューにルーティングする必要があります。古いサイトのページにマップされない新しいアクションがあることに気付いた場合は、コントローラーのビューを作成し、適切な //TODO: タグを含めて、後で実装するためにこれを追跡できるようにします。既存のページを移行しました。
d. global.asax.cs ファイルに {*catchall} ルーティング ルールがない場合は、不明なアクションの処理コードを追加することも検討してください。
e. モデルのコンストラクター クラスを作成して、コントローラーが持つ特定のパラメーター ({id} または URL からの Request.QueryString パラメーター、または HTTP ヘッダーまたは Cookie として渡される可能性がある) をモデルが認識できるようにします。既存のビジネス ロジック クラスにアクセスし、View によるレンダリングのためにそれ自体を構築します。
f. リストの次のページに移動し、手順 a からやり直します。
最後に、新しいコントローラーを呼び出し、作成したアクションを実装できるようにするルーティング ルールを作成します。デバッグ、デバッグ、デバッグ...すべて問題がなければ、メイン サイトから移行した既存のフォルダーとファイル、および global.asax.cs の IgnoreRoute ルールを削除します。
継続のために古いディレクトリ名とファイル名を保持したい場合は、任意の方法でリダイレクトを作成します (たとえば、ユーザーが古いサイトの特定のページを既にブックマークしている可能性があります)。
注: 移植段階で MVC サイトの古いサブディレクトリの正確な名前を保持している場合は、サブディレクトリ全体を一度に移行することをお勧めします。ルーティング規則のパスと同じ名前の既存のフォルダーが存在し、そのフォルダーに Default.aspx ファイルがある場合、(/foldername/) は既定で Default.aspx ページに設定されるため、書き込みはより複雑になります。ルール。
ヒント:ルートのデバッグにRouteDebugなどのツールを使用することを真剣に検討してください。これにより、上記のような奇妙なことを把握したり、複数のルーティング ルールが実行されて予期しない動作を引き起こしたりする場合に解決できます。
これは私の最初のドラフトです。ステップを見逃した場合やガイドに穴が見つかった場合は、フィードバックをお寄せください。回答を適切に変更します。
ASP.NETWebFormsからASP.NETMVCへの「段階的な移行」のようなものはないと思います。これらは同じフレームワーク上に構築された2つの完全に異なるデザインパターンですが、Webを構築するだけではない場合は、(ほとんどの場合)移動するだけでなく、完全に再設計する必要があるものがたくさんあります。 WebFormsテンプレートの代わりにMVCテンプレートプロジェクトのアプリ。
これの主な理由は、関心の分離です。これは、WebFormsよりもMVCの方がはるかに厳密です。私は現在、古くてかなりバグのある趣味のプロジェクトをWebFormsからMVCに移行する作業を行っています(まあ、そうあるべきです...)。私のアプローチは基本的に「機能を調べて、最初から再構築する」ことです。もちろん、新しいプロジェクトに含めた出力などをフォーマットするためのヘルパーメソッドがいくつかありましたが、基本的なもののほとんどは、完全にやり直すためだけに選択しました。1年半前にWebFormsアプリ用に設定したMVCで同じ目標を達成するのに、Entity Framework、jQuery、その他の優れた機能を使用して、私がどれほど時間がかからないかに驚かれることでしょう。数時間以内に結果を出すことができます。