5

WebForms .Net 4.0 を使用するソリューションがあります。同じソリューションで MVC3 を利用する予定です。私は Scott Hanselmanのブログをフォローしていましたが、順調に進んでいました。

私はこれにまったく慣れていないことを認めなければなりません。ただし、名前空間に関してルートが実際にどのように機能するかについて、私は大きな部分を見逃しているようです。

現在、私たちのソリューションには次のものがあります。

WebApplicatin: 
  Accounting
      Receivables
         ReceivablesGrid.aspx
         ReceivableForm.aspx
      Payables
        PayablesGrid.aspx
        PayablesForm
 ..etc.

したがって、次を使用してページをリクエストできます

Domain/Accounting/Receivables/ReceivablesGrid.aspx
Domain/Accounting/Receivables/ReceivableForm.aspx?Key=1
Domain/Accounting/Payables/PayablesGrid.aspx
Domain/Accounting/Payables/PayablesForm.aspx?Key=1

....

MVCに似た別のレイヤーを追加する予定です。

WebApplicatin: 
      Accounting
          Receivables
             ReceivablesGrid.aspx
             ReceivableForm.aspx
             Mobile
              Controllers
                ReceivableConroller.cs
              Models
              Views
                Receivables
                   Index
                   Update
                   Edit
                   Create
          Payables
            PayablesGrid.aspx
            PayablesForm
            Mobile
              Controllers
                PayablesConroller.cs
              Models
              Views
                Payables
                   Index
                   Update
                   Edit
                   Create

     ..etc.

もちろん、これは本名ではありません。ただし、できるだけ自分の状況に近づけようとしました。残念ながら、同じ名前空間に追加される可能性のあるロジックの一部を使用できるため、これに従うのが最善です。さらに、ルートにコントローラー、ビュー、モデルに似たフォルダーを作成しても、私のソリューションでは機能しません。

Global.asax で、次のようなルートを追加しました。

routes.MapRoute(
      "AccountingReceivablesMobile", // Route name
      "Accounting/Receivables/Mobile/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

routes.MapRoute(
      "AccountingPayablesMobile", // Route name
      "Accounting/Payables/Mobile/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

私が最終的に試みた別の解決策は、RazorViewEngine を拡張することです。新しいエンジンのコンストラクターで、次のように 2 つのプロパティを設定します。

base.ViewLocationFormats = new string[] { "~/Accounting/Receivables/Mobile/Views/{1}/{0}.cshtml",
"~/Accounting/Payables/Mobile/Views/{1}/{0}.cshtml"
 };

base.MasterLocationFormats = new[] { "~/Views/Shared/{0}.cshtml"}. 

これは非常にうまくいきました。ただし、これらのルートを追加することは、webForm を追加するほどスケーラブルではないと感じています。私の問題は、可能なすべてのルートにルートを追加したくないということです。つまり、新しいビューを追加すると、配列への別のルートまたはエントリが作成されます。それで、どうすればこれをもっと簡単にできますか?私は何を間違っていますか?Areas を見ましたが、Areas フォルダーを作成してその中に入れる必要があるようです。

ありがとう、

4

1 に答える 1

4

ASP.NET MVC(およびRailsや他の多くのMVC実装)は設定より規約に依存しているため、フレームワークは実際にはサイトのルートに、、、およびディレクトリを配置する必要があります。ルーティングエンジンに規則からの逸脱を検出させるために行っている作業は、MVCが実行を妨げようとしていることです。\controllers\views\models

Razorエンジンを使用したテストのように、フレームワークの一部を拡張することもできます...しかし、個人的には、フレームワークの規則を採用しているため、少し注意が必要なシナリオもありますが、 ASP.NET MVCの簡単な知識により、コードを開いて、必要な領域をすぐに見つけることができます。これらの規則ベースのフォルダーを他のフォルダーの下にネストすると、MVC領域として定義されていない限り、それはそれほど明白ではなくなります。

ASP.NETWebFormsとMVC3のハイブリッドである2つの本番ソリューションがあります。どちらの場合も、デフォルトのアプローチ(コントローラー、モデル、ルート内のビューフォルダー)を使用して、リポジトリパターンなどの最新の標準を利用し、一般的なビジネスロジックを「サービス」に移行するために、レガシーWebフォームコードベースのリファクタリングを開始しました。名前空間またはソリューション内の新しいアセンブリ。

コードをリファクタリングして、ビジネスロジック/リポジトリクラスのインターフェイスを使用する可能性がある場合(ほとんどの人がWebフォームを使用していなかったため、現在は使用していないと想定しています)、Ninjectまたは別のIoCコンテナを使用して従来のWebフォームとMVCコントローラーの両方で、このロジックの配線を簡単にし、より良い構造と単一の懸念事項を可能にします。通常あなたのApp_Start()

using名前空間の外部にあることに関しては、別の名前空間に対してコードを記述した場合、ReSharperやCodeRushなどの生産性ツールがステートメントを自動的に検出して入力します。

これはあなたが探している答えではなく、一部の人は炎上するかもしれませんが、一歩下がって解決しようとしていることを確認することが重要だと思います。シナリオに合わせてMVCの基本アーキテクチャを複雑にすると、従来のビジネスロジックをリファクタリングする時間/リソースがない場合は延期するか、組み込みの規則を採用するように促されます。いくつかの単純なコントローラーから始めて、Webフォームアプリの問題点を取り除き、時間の許す限り、ページをMVCに移植し始めます。暫定的にはきれいではないかもしれませんが、それは簡単です。

これは非常に良い質問であり、Razorを拡張してオプションを調査するという素晴らしい仕事をしました。他の誰かが標準のMVCフォルダーの規則から逸脱することを考えているかどうかを確認したいと思います。多分私はただうるさいですか?

あなたの主な最終目標があなたのサイトをモバイル対応にすることであるならば、チェックする最後のことは、スティーブ・サンダーソンによるこの記事です。モバイルデバイスの検出に優れた51Degrees.mobiアセンブリを活用し、ASP.NETおよびASP.NETMVC内での使用をカバーします。サンダーソンはまた、彼の個人的なブログに同じトピックについて同様の投稿をしています。

于 2011-05-02T19:14:17.753 に答える