MVC - 在一个视图中显示多个Controller结果

时间:2014-11-24 16:10:21

标签: asp.net-mvc-4

我的MVC公司中有一个控制器,它有以下两种方法:

public ActionResult _GetServiceStatus()
{
...
}

public ActionResult _GetEventLogErrors()
{
...
}

这些方法中的每一个都引用了我分别存储在模型,服务和事件中的不同类类型。这些可以在下面看到:

public class Service
    {
        public string Name { get; set; }
        public string Status { get; set; }
    }

    public class Event
    {
        public string Source { get; set; }
        public string EntryType { get; set; }
        public string Message { get; set; }
        public DateTime Date { get; set; }
    }

我想要做的是在单个视图上显示这些方法的结果。我已经将此工作用于服务检查,结果显示正确,但我找不到如何添加事件结果。

我目前的观点如下:

@{
    ViewBag.Title = "Monitoring";
}

@model IEnumerable<SystemMonitoringTool.Models.Monitoring.Service>

<div style="width:25%">
    <span>
        Services
    </span>
    <table id="services" style="border:solid; border-width:2px; width:100%">
        @foreach (var item in Model) {  
         <tr>
             <td>
                 @Html.DisplayFor(model => item.Name)
             </td>
             <td>
                 @Html.DisplayFor(model => item.Status)
             </td>
         </tr>                       
        }
    </table>
</div>

有人可以帮我找到在同一视图上并排显示这些内容的方法吗?如果需要,将很乐意提供更多信息。

1 个答案:

答案 0 :(得分:3)

两个选项:

  1. 使用子操作。而不是直接转到其中一个单独的控制器操作,而是添加如下操作:

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

    你会注意到这个动作做得不多。它只是渲染一个视图。然后,您需要将服务/事件的HTML移动到部分视图中。例如,_GetServiceStatus.cshtml_GetEventLogErrors.cshtml,其中每个模型的模型将分别是ServiceEvent类型的集合。最后,在您的Monitoring.cshtml视图中(基于上面的操作名称),您将添加:

    @Html.Action("_GetServiceStatus")
    @Html.Action("_GetEventLogErrors")
    

    此视图不需要模型,因为它不能直接使用任何模型。

  2. 使用封装两个集合的视图模型:

    public class MonitoringViewModel
    {
        public List<Service> Services { get; set; }
        public List<Event> Events { get; set; }
    }
    

    然后你还需要一个统一的行动。但在这里,您将填充两个列表。基本上,您只需将现有的两个动作合并为一个:

    public ActionResult Monitoring()
    {
        var model = new MonitoringViewModel
        {
            Services = /* code to retrieve services */,
            Events = /* code to retrieve events */
        }
        return View(model);
    }
    

    然后,您可以单独遍历每个列表以构建HTML:

    Monitoring.cshtml (同样,根据操作名称)

    @model Namespace.To.MonitoringViewModel
    
    ...
    
    <table id="services" style="border:solid; border-width:2px; width:100%">
        @foreach (var item in Model.Services) { // notice the change here  
         <tr>
             <td>
                 @Html.DisplayFor(model => item.Name)
             </td>
             <td>
                 @Html.DisplayFor(model => item.Status)
             </td>
         </tr>                       
        }
    </table>