2013-04-08 74 views
1

我一直在努力解決這個問題無濟於事。使用MVC4我有3個模型,我希望通過部分視圖在單個視圖中顯示。單視圖由3個部分視圖(3個編號列表)組成。我可以得到一個模型視圖中顯示,但無法弄清楚如何顯示其他2MVC4問題,在單個視圖上顯示多個部分視圖

以下是我對視圖控制器:

[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的聲明下:

@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> 

在每一個局部視圖標題如下:

Dashboar dClubs

@model IEnumerable<GMC.Models.Clubs> 

DashboardMembers

@model IEnumerable<GMC.Models.MemberUsers> 

DashboardAlerts

@model IEnumerable<GMC.Models.Alerts> 

現在的問題是如何傳遞的三個數據庫上下文到儀表板?我很困惑,並且很掙扎。

回答

2

很多方法你可以做到這一點,並使其通用,但他們將主要都有一個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我會用行動/的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()); 
    } 

...

Dashboard.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> 
+0

你的答案似乎工作,但我走了第二條路線。非常乾淨,非常棒。如果可以的話+ 100。 – ApolloSoftware 2013-04-08 20:53:01

+0

Action與RenderPartial和Partial完全相反?我應該知道這一點。但是ASP.NET MVC4對我來說比較新。 – ApolloSoftware 2013-04-08 20:55:47

+1

@AmitApollo .Partial()將直接使用Clubs.cshtml,因此您必須將模型數據傳遞給它,就像我在第二個參數中那樣。 .Action()將調用一個動作方法,並且該動作可以執行任何需要的查詢數據並將其傳遞給'return Partial(myDataHere)'。 – AaronLS 2013-04-08 21:02:11

2

您需要爲Dashboard頁面創建特定的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(); 
... 

你會那麼需要更新的觀點在這方面採取新的視圖模型

@model DashboardViewModel 

最後,從內部看,您需要將數據傳遞給每個部分:

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

@Html.Partial("DashboardClubs", Model.Clubs) 
+0

這工作了。我剛剛與AaronLS的第二個解決方案一起使用,但無論如何+1。 – ApolloSoftware 2013-04-08 20:54:00

相關問題