web-dev-qa-db-ja.com

既存のasp.netアプリケーションをasp.net MVCパターン形式に移行する方法

既存のASP.NETアプリケーションをASP.NET MVCパターン形式に移行したい。どのような手順に従う必要がありますか?ステップバイステップの指示があれば非常に役立ちます。

39
prabu

これらは、従来のASP.Net WebformsからASP.Net MVCへの移行中に会社で実行した手順に基づいた、私のステップバイステップガイドです。それは完璧ではなく、サイトのサイズのために段階的にこれを行わなければならないのでまだ進行中ですが、おそらく他の誰かが私たちの結果に基づいて改善された回答を見つけて提出します。

段階:1.計画-ASP.NetのWebフォームからMVCに移行するには、慎重な計画が必要です。私たちが移動中に行った間違いは、この計画段階にはルート計画とモデル/コントローラー/アクション計画の2つの側面があることに気づいていません。これを行わないと、後でサイトの機能を拡張したり、より複雑な移行を試みたりするときに、深刻な問題が発生します。

ヒント:-現在のサイトマップを確認し、ASP.Net MVCアプリケーションで使用する改良されたサイトマップ/ディレクトリ構造を設計します。ウェブサイトの「言語」を理解します。 ASP.Net MVCのデフォルトの動作は http:// sitename / {controller}/{action}/{id}の動作になりますが、ルーティングをハッキングする経験が増えると、これをオーバーライドできますルール。

  • デフォルトでは、各コントローラーは、アプリケーションの仮想サブディレクトリ(例: 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.aspxhttp:// sitename/profile/about になり、profileController内の「about」ActionResultメソッドにマッピングされます。これにより、一連のスプリントで1つまたは2つのディレクトリ(または1つのディレクトリ内のいくつかのファイル)を部分的に移行することで、サイト全体を1回で移行するよりもはるかに長い時間をかけずに、俊敏性を維持できます。

  1. Visual Studioで新しいASP.Net MVCアプリケーションを作成し、現在のサイトに存在するフォルダーのルーティングルールを無視するルールをGlobal.asaxファイルにすぐに作成します。

  2. ASP.Net WebアプリケーションからASP.Net MVCアプリケーションフォルダーにフォルダーをコピーします。 Webサイトを実行し、正しく機能することを確認します(ルーティングルールがまだ使用されていないため、正常に機能するはずです)。

  3. 移行するサブディレクトリまたはサブディレクトリ内のファイルのサブセットを選択します。

  4. このサブディレクトリ内の各.aspxページ:

    a。最初にビューを作成します。私は、WebブラウザーでレンダリングされたバージョンのページをベースHTMLとして使用し、動的データが入力されていることがわかっている場所にプレースホルダーを配置する傾向があります。

    b。動的データのプレースホルダーを使用して、単純なデータ型を使用してモデルの最初のドラフトを作成します。このモデルは単純なものから始まりますが、元のサイトからより多くのページを移行するときに常にリファクタリングされるため、少し重く見えても心配する必要はありません。 1つのモデルのプロパティが多すぎて好みに合わない場合、またはアイテムの特定のサブセットのモデルだけでなく論理的なグループ化が見られる場合、これは、モデルをリファクタリングして、これらの単純なデータの代わりにオブジェクトを持つ必要があることを示している可能性がありますプロパティとしての型ですが、ビジネスロジックレイヤーで構成されます。

    c。コントローラーがまだ作成されていない場合は作成し、計画がこのビューにルーティングする必要があると判断したアクションに適切なActionResultメソッドを配置します。古いサイトのページにマップしない新しいアクションがあることに気付いた場合は、コントローラーのビューを作成し、適切な// TODO:タグを含めて、これを追跡して実装後に追跡できるようにします。既存のページを移行しました。

    d。このための{* catchall}ルーティングルールがglobal.asax.csファイルにすでにない場合は、不明なアクションの処理コードを含めることも検討してください。

    e。コントローラーが持つ特定のパラメーター({id}として渡されるか、URLからのRequest.QueryStringパラメーター、またはHTTPヘッダーまたはCookieとして渡される)を指定して、モデルが既存のビジネスロジッククラスに手を伸ばし、ビューによってレンダリングするために自分自身を構築します。

    f。リストの次のページに移動し、ステップaからやり直してください。

  5. 最後に、新しいコントローラーを呼び出すルーティングルールを作成し、作成したアクションを実装できるようにします。デバッグ、デバッグ、デバッグ...すべてが順調に進んだら、メインサイトから移行した既存のフォルダーとファイル、およびglobal.asax.csのIgnoreRouteルールを削除します。

  6. 継続性のために古いディレクトリとファイル名を保持したい場合は、好きな方法でリダイレクトを作成します(たとえば、ユーザーが古いサイトの特定のページを既にブックマークしている場合があります)。

注:移植フェーズ中にMVCサイトの古いサブディレクトリの正確な名前を保持している場合は、私が認識した時点でサブディレクトリ全体を移行することをお勧めします。ルーティングルールのパスと同じ名前の既存のフォルダーが存在し、そのフォルダーにDefault.aspxファイルがある場合、ルーティングよりも精度が高くなるため、(/ foldername /)はデフォルトでDefault.aspxページになります。ルール。

ヒント:ルートデバッグに RouteDebug のようなツールを使用することを真剣に検討して、上記のような奇妙なことを理解したり、複数のルーティングルールが実行されて予期しない動作が発生したりする場合を考えてください。

これは私の最初のドラフトです。手順を逃した場合、またはガイドに穴がある場合はフィードバックを提供してください。回答を適切に変更します。

71
Nissan

ASP.NET WebFormsからASP.NET MVCへの「段階的な移行」のようなものはないと思います。これらは、同じフレームワーク上に構築された2つの完全に異なるデザインパターンですが、(ほとんどの場合)Webを構築したくないだけの場合は、移動するだけでなく、完全に再設計する必要のあるものがたくさんあります。 WebFormsテンプレートの代わりにMVCテンプレートプロジェクトのアプリ。

これの主な理由は、懸念事項の分離です。これは、MVCではWebフォームよりもはるかに厳格です。私は現在、古くてバグの多い趣味のプロジェクトをWebFormsからMVCに移行する作業をしています(そうでなければなりません...)。私のアプローチは基本的に「機能を確認し、ゼロから再構築する」ことでした。もちろん、出力をフォーマットするためのヘルパーメソッドなど、新しいプロジェクトに含めただけですが、完全にやり直すために選択した基本的なもののほとんどは。 Entity Framework、jQuery、その他の便利な機能を使用して、1年半前にWebFormsアプリ用に設定したMVCで同じ目標を達成するのに、ほとんど時間がかからないことに驚かれるでしょう。数時間以内に結果を出すことができます。

2
Tomas Aschan

これらのいくつかの追加のヒントが役立ちますように

  • <%-コメントタグを@ *に置き換えます
  • 追加がある場合は、@RenderSection( "Footer"、false)を@sectionフッター{}などに使用しますContentPlaceHolderビューの本体を除きますRenderBody()。

  • すべての古い通常runat = "server"タグは無害で、コンパイルを妨げず、後でクリーンアップできます

  • コードビハインドとマークアップ(Visible = "True")で簡単に制御され、コントロールIDを使用してcode_behindで制御されるすべてのコントロールの可視性は、 ViewBagコレクションとRazorビューの@ ifブロック。

  • このトピックに関するPluralsightのこの素晴らしいコースもご覧いただけます(3時間49分)

2
Iman Abidi

私の答えは「あなたはしません」です:)。これを本当に実行したい場合は、現在のasp.netサイトを最終目標として、または要件の「ドキュメント」として使用できます。モデルでデータレイヤーを使用することもできますが、サイト全体を再設計する必要があります。

Tomasが既に指摘したように、これは従来のasp.netとはまったく異なります。

1
Morph