【问题标题】:MVC4 issue with showing multiple partial views on a single View在单个视图上显示多个部分视图的 MVC4 问题
【发布时间】:2016-01-25 00:07:38
【问题描述】:

我一直在努力解决这个问题,但无济于事。使用 MVC4,我希望通过局部视图在单个视图上显示 3 个模型。单一视图由 3 个部分视图(3 个数字列表)组成。我可以让一个模型显示在视图中,但不知道如何显示其他 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 语句下的:

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

现在我的问题是如何将三个数据库上下文传递到仪表板?我彻底糊涂了,正在苦苦挣扎。

【问题讨论】:

    标签: asp.net asp.net-mvc razor asp.net-mvc-4


    【解决方案1】:

    您可以通过多种方式实现此目的并使其具有通用性,但它们大多都有一个 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>
    

    就个人而言,我会使用 Action/RenderAction 而不是使用 Html.Partial,因为它们将允许您实际调用另一个返回 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>
    

    【讨论】:

    • 您的两个答案似乎都有效,但我选择了第二条路线。非常干净,非常棒。如果可以的话 +100。
    • 相对于 RenderPartial 和 Partial,Action 到底做了什么?我应该知道这一点。但是 ASP.NET MVC4 对我来说相对较新。
    • @AmitApollo .Partial() 将直接使用 Clubs.cshtml,因此您必须将模型数据传递给它,就像我在第二个参数中所做的那样。 .Action() 将调用一个操作方法,该操作可以执行任何查询数据所需的操作并将其传递给return Partial(myDataHere)
    【解决方案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)
    

    【讨论】:

    • 这也有效。我刚刚选择了 AaronLS 的第二个解决方案,但无论如何 +1。
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多