1

私はMVCを初めて使用するので、質問がばかげている、または単純すぎると思われる場合は、失礼します。データベースアクセスにエンティティデータモデルを使用しています。そのため、ModelsフォルダーにEDMXファイルを追加し、コントローラーと強く型付けされたビューからモデルクラスにアクセスできます。コントローラ内の複数のテーブルにアクセスすると、問題が発生します。

DBに次のテーブルがある場合:

 Departments(DepartmentID, DepartmentName, DepartmentPhone)
 Insurances(InsuranceID, InsuranceName, InsuranceAddress)
 Employees(EmployeeID, EmpFName, EmpLName, DepartmentID, InsuranceID)

そして、従業員のリストとその部門および保険情報を表示したいと思います。

私のコントローラーのアクションメソッドでは、EDMを使用してDBにアクセスし、匿名タイプで情報を取得します。

 using (var context = new MyEntities())
        {
            var model = (from d in context.Departments
                         join e in context.Employees on d.DepartmentID equals e.DepartmentID
                         join I in context.Insurances on I.InsuranceID equals e.InsuranceID

                         select new
                         {
                             DepartmentID = d.DepartmentID,
                             EmployeeID= e.EmployeeID,
                             EmpFName= e.EmpFName,
                             EmpLName= e.EmpLName,
                             DepartmentName= d.DepartmentName,
                             InsuranceName= I.InsuranceName

                         }).ToList();

            return View(model);
        }

Modelフォルダーにこの匿名タイプのクラスがないため、厳密にタイプされたビューを作成できません。では、このリストをビューに渡すための最良の方法は何ですか?コレクションが大きすぎる場合、viewbagを使用するのはやり過ぎになります。この匿名クラスの新しいモデルを作成することは、Controllers Action Methodで選択を変更した場合、常に更新する必要があるため、正しく聞こえません。

すべての提案を歓迎します。SOに関する他の質問を調べてみましたが、関連するものが見つかりませんでした。

ありがとう。

4

3 に答える 3

2

モデルフォルダにこの匿名タイプのクラスがないため、強く型付けされたビューを作成できません

プロジェクトを右クリックし、[新しいクラスを追加...]をクリックすると、モデルフォルダーにタイプが追加されます。これは、ASP.NETMVC=>ビューモデルに移動する方法です。

そして、明らかにあなたはこのタイプをあなたのビューに渡します:

select new MyViewModel
{
    DepartmentID = d.DepartmentID,
    EmployeeID = e.EmployeeID,
    EmpFName = e.EmpFName,
    EmpLName = e.EmpLName,
    DepartmentName = d.DepartmentName,
    InsuranceName = I.InsuranceName
}).ToList();

そしてもちろん、ビューはこのビューモデルに強く型付けされるようになります。

@model IEnumerable<MyViewModel>
...
于 2012-07-12T06:55:24.627 に答える
0

事前定義された強く型付けされたViewModelsが進むべき道だと思います。一見重複しているように見えるコードを複数の場所で更新しなければならないのは苦痛ですが、私の経験では、それは小規模なプロジェクトの場合にのみ問題になります。プロジェクトが成長するにつれて、データベースモデルオブジェクト(エンティティ)と、検証および処理属性やビュー固有のデータなど、ビューに渡されるビューモデルとの違いがわかり始めます。その時点に到達すると、個別のエンティティを持つことを好むようになります。およびViewModelの定義。

ただし、トピックに戻ります。問題の別の解決策は、リフレクションを使用して匿名型をDictionary<String,Object>オブジェクトに変換することです。ASP.NET MVCは、new { foo = "bar" }-syntax式をルート値とHTML属性のディクショナリに変換するためにこれを実行していることに注意してください。パフォーマンスは許容範囲内ですが、1つのHTTPリクエストに対して10,000個のオブジェクトに対してそれを実行しようとしないでください。そうしないと、機能が低下する可能性があります。

そのためのコードは次のようになります。

Object anonymousType = new { whatever = "foo" };
Dictionary<String,Object> dict = new Dictionary<String,Object>();

foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(anonymousType )) {
    Object value = descriptor.GetValue(anonymousType );
    dict.Add( descriptor.Name, value );
}

もちろん、これは、ビューがコンパイル時の型チェックの恩恵を受けないことを意味し、辞書キーの文書化されたリストを維持する必要があります(ビュー内のキーを反復処理していないと仮定します)。

当然のように思われるため、Microsoftが匿名型にIDictionaryを自動的に実装させなかったことに驚いています。

于 2012-07-11T23:57:20.257 に答える
0

ダイナミックタイプはあなたの友達です。

モデルのように動的で、ビューを緩く型付けされたものとして宣言できます

@model dynamic

強く型付けされたビューで行うのと同じように、モデルのプロパティにアクセスします

<h1>Model.DepartmentId</h1> - <h2>Model.DepartmentName</h2>
<span>Model.EmployeeId</span>

問題は、ダイナミクスには内部プロパティが含まれていると考えていました。MVC2を使用している場合は、それを機能させるために少しトリックが必要です。しかし、MVC3以降では、不要になっているようです。

于 2012-07-12T06:50:57.750 に答える