3

私はこの問題に苦労して無駄になりました。MVC4 を使用して、部分ビューを介して単一のビューに表示したい 3 つのモデルがあります。シングル ビューは、3 つの部分ビュー (3 つの数値リスト テーブル) で構成されます。1 つのモデルをビューに表示することはできますが、他の 2 つのモデルを表示する方法がわかりません。

ビューコントローラーについて私が持っているものは次のとおりです。

[AllowAnonymous]
    public ActionResult Dashboard()
    {
        //Database.SetInitializer<AlertsContext>(null);
        Database.SetInitializer<MemberUsersContext>(null);
        //Database.SetInitializer<ClubsContext>(null);

        //AlertsContext db = new AlertsContext();
       MemberUsersContext db = new MemberUsersContext();
        //ClubsContext db = new ClubsContext();
        //db.MemberUsers.ToList()
        return View(db.MemberUsers.ToList());
    }

これは、ビュー自体のモデルとして私が持っているものです (コンパイルするには、 @model IENumerable ステートメントの下にない 2 つを削除します。

    @model IEnumerable<GMC.Models.MemberUsers>

    <div class="dashboard_alerts">    
      @Html.Partial("DashboardAlerts")
   </div>

    <div class="dashboard_pending_clubs">    
       @Html.Partial("DashboardClubs")
    </div>

    <div class="dashboard_verified_members">    
       @Html.Partial("DashboardMembers")
     </div>

各部分ビューのヘッダーは次のとおりです。

ダッシュボードクラブ

    @model IEnumerable<GMC.Models.Clubs>

ダッシュボードのメンバー

    @model IEnumerable<GMC.Models.MemberUsers>

ダッシュボードアラート

    @model IEnumerable<GMC.Models.Alerts>

私の質問は、3 つのデータベース コンテキストをダッシュ​​ボードに渡す方法です。私は完全に混乱し、苦労しています。

4

2 に答える 2

3

これを実行して汎用にする方法はたくさんありますが、ほとんどすべてに ViewModel があります。ダッシュボード ビューをサポートするために特別に作成するクラス:

public class DashboardViewModel {   
  public IEnumerable<GMC.Models.Clubs> Clubs {get;set;}
  public IEnumerable<GMC.Models.MemberUsers> MemberUsers {get;set;}
  public IEnumerable<GMC.Models.Alerts> Alerts {get;set;}
}

これらがデータベース内の単なる異なるテーブルである場合、コンテキストは接続と他のリソースを管理するため、それらはすべて同じコンテキストを介してアクセスする必要があります。ただし、そのコードを見なければ、その接線には進みません。

[AllowAnonymous]
    public ActionResult Dashboard()
    {
        //populate data into our view model(vm)
        var vm = new DashboardViewModel{
           Clubs = db.Clubs.ToList(),
           MemberUsers = db.MemberUsers.ToList(),
           Alerts = db.Alerts.ToList()
        };
        return View(vm);
    }

ダッシュボード ビュー:

    @model DashboardViewModel

    <div class="dashboard_alerts">    
      @Html.Partial("DashboardAlerts", Model.Alerts)
   </div>

    <div class="dashboard_pending_clubs">    
       @Html.Partial("DashboardClubs", Model.Clubs)
    </div>

    <div class="dashboard_verified_members">    
       @Html.Partial("DashboardMembers", Model.MemberUsers)
     </div>

個人的には、Html.Partial を使用する代わりに、Action/RenderAction を使用します。これにより、PartialViewResult を返す別のアクションを実際に呼び出すことができるため、各アクションは独自のデータを取得する責任があります。いつもこのようにしているわけではありませんが、適切であれば、アクション/部分ビューはその方法でより再利用できます。

これは次のようになります。

    public ActionResult Dashboard()
    {
        return View();
    }

    public PartialViewResult Clubs()
    {
       ....
        return PartialView(db.Clubs.ToList());//this assumes the partial view is named Clubs.cshtml, otherwise you'll need to use the overload where you pass the view name
    }

    public PartialViewResult Alerts()
    {
       ....
        return PartialView(db.Alerts.ToList());
    }

...

ダッシュボード.cshtml

    <div class="dashboard_alerts">    
      @Html.Action("Alerts")
   </div>

    <div class="dashboard_pending_clubs">    
       @Html.Action("Clubs")
    </div>

    <div class="dashboard_verified_members">    
       @Html.Action("Members")
     </div>
于 2013-04-08T20:43:36.957 に答える
2

ダッシュボード ページに固有の ViewModel を作成する必要があります。

public class DashboardViewModel
{
  public IEnumerable<GMC.Models.Clubs> Clubs { get; set; }
  public IEnumerable<GMC.Models.MemberUsers> Users  { get; set; }
  public IEnumerable<GMC.Models.Alerts> Alerts  { get; set; }
}

次に、ダッシュボード アクション メソッドで、各リストにデータを入力します。

myModel.Users = db.MemberUsers.ToList();
...

次に、この新しい ViewModel を取り込むようにビューを更新する必要があります

 @model DashboardViewModel

最後に、ビュー内から、各パーシャルにデータを渡す必要があります。

@Html.Partial("DashboardAlerts", Model.Alerts)

@Html.Partial("DashboardClubs", Model.Clubs)
于 2013-04-08T20:39:42.370 に答える