2011-06-29 4 views
0

最近、多くのデータソースで処理する必要がある複雑なビューの設計を開始すると、プロジェクトで醜い問題に直面しました。このビューの目的は、顧客のプロファイルに関連するデータを表示することですが、基本情報、関連するプロジェクト、財務データ、連絡先情報など、このプロファイルを作成したものです。これらのデータはすべて同じビューでグループ化され、更新可能でなければなりません。これに加えて、ビューの右ペインには、顧客情報に関係のない他のソースを指すウィジェットのいくつかがあります。 これを解決するための私のアプローチがあった。personalInfoModelcutomerProjectModelfinancialInfoModel、およびcontactInfoModelMVC 3のコンポジションビューのデザイン

  1. が、それはのような様々なモデルの混合だハイブリッドモデルを作成します。ところで、私はMicrosoftのエンティティフレームワークを使用していますので、ここではすべてのモデルがエンティティと1対1で対応しています。このハイブリッドモデルで
  2. 、私がメインビューへの接続を行う(のはCustomerViewを言わせて)ので、ビューコードの1行目に次のようなものを参照することができます:私は、メインビュー内

    <%@ Page ..... Inherits="...MyProject.Models.hybridCustomerModel" 
    
  3. <% Html.RenderPartial("UC_BasicInfo"); %> 
    <% Html.RenderPartial("UC_ProjectInfo"); %> 
    <% Html.RenderPartial("UC_FinancialInfo"); %> 
    <% Html.RenderPartial("UC_ContactInfo"); %> 
    

    これは、メインビューをレンダリングするためのユーザーコントロールを使って少し簡単にしたいからです。

  4. すべてのユーザーコントロール(¨* .ascx)は、ハイブリッドモデルを指しているので、問題のないフォームのコントロールでバインディングを行うことができます。

  5. コントローラーでは、少し不規則に見えます。すべての* .ascxには、 "post request"を処理するアクションのメソッドがあります。しかし、最初のロードまたはGet要求は、View Name:CustomerViewと一致する唯一のアクションメソッド内で行われます。 ユーザビリティと応答性のために、私はjqueryを使用して投稿要求を行います。 しかし、データレイヤーはモデルによって作成されたすべてのエンティティでマップされるモデルのみを受け取るため、Post Requestに含まれるプレーンモデルでハイブリッドモデルをマッピングする作業が必要です。

  6. 最後に、使用しているハイブリッドモデルからデータを取得するために、ビューの右ペインにあるウィジェットの<% Html.RenderAction() %>を使用しています。

この場合、いくつかの異なる方法がありますか?

答えて

0

これを単純化するために使用できるアプローチがいくつかあると思います。

最初に、ハイブリッドビューの代わりに、ビューモデルクラスを作成しないでください。これにはハイブリッドデータが含まれますが、純粋なpocoクラスになります。あなたがどのフィールドが公開されているかを制御するので、バインドする方がはるかに安全です。

ascxごとにコントローラメソッドを持たせることは悪いことではありませんが、1つのフォームでページをラップする場合は、button type = "submit"(入力type = submitではなく)を使用できます)またはjavascriptを使用して、どのボタンが押されたか、投稿されたビューデータのどのビットをEFクラスにマップするかを指示します。

別のアプローチ、およびすでにジャバスクリプトへの依存をとっていることを考えると、これは私が有利に働くいずれかです。

私は一つ一つを与える、独立したパーシャルにページをデカップリングするためのペアをしようと思いますコントローラメソッド(GetとPost)を呼び出して、Ajaxタイプの呼び出しで各部分を要求してページをアセンブルします。相互依存性が固定され、非周期的である場合、これは解決しやすいでしょう。そうでなければ、軽いメッセージングフレームワークを開発する必要があるかもしれません。あるいは、いくつかのタイプの更新を許可するだけです。ページ全体のリフレッシュをトリガします。

関連する問題