向我的视图发送包含2个对象列表的类

时间:2018-12-01 12:09:54

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我的目标是:向我的视图发送一个包含2个对象列表的类

为此,这是我尝试继续的方法:

  1. 我打电话给数据库,该数据库向我返回了我所有事件的列表。
  2. 我再次调用数据库,这将返回所有子事件的列表。
  3. 我有一个EventViewModel类,其中包含一个List <_EventsLines>类和一个List <_SubEventsLines>类。
  4. 我需要在单个视图中发送这2个查询的结果,但我不知道该怎么做(如果可能的话)

我连接到数据库文件管理器,它基于一个单一的视图,这就是为什么我必须打两次电话。

但是然后我想将这2个调用的结果放在同一个对象(oEventViewModel)中,以便将它们发送回我的视图。

您有解决办法吗?

控制器

[Authorize]
[HttpGet]
public async Task<ActionResult> Index()
{
    ViewBag.sessionv = HttpContext.Session.GetInt32("idMember");
    FileMakerRestClient client = new FileMakerRestClient(serverName, fileName, userName, password);
    var toFind = new Models.EventsLines { Zkf_CTC = 1053 };
    var results = await client.FindAsync(toFind);

    Models.EventViewModel oEventViewModel = new Models.EventViewModel
    {
        _EventsLines = (from o in results select o).ToList()
    };

    var xtoFind = new Models.SubEventsLines { Zkf_CTC = 1053 };
    var xresults = await client.FindAsync(xtoFind);

    Models.EventViewModel oSubEventViewModel = new Models.EventViewModel
    {
        _SubEventsLines = (from x in xresults select x).ToList()
    };


    ViewBag.Zkf_CTC = 1053;
    ViewBag.JsonList = oEventViewModel;

    return View(oEventViewModel);
}

模型

public class EventViewModel
{
    public List<EventsLines> _EventsLines { get; set; }
    public List<SubEventsLines> _SubEventsLines { get; set; }
}

2 个答案:

答案 0 :(得分:0)

有多种方法可以在单个视图中使用多个模型。在这里,我将一一解释。

1。使用动态模型 ExpandoObject(System.Dynamic命名空间)是添加到.Net Framework 4.0的类,该类使我们可以在运行时动态地向对象添加和删除属性。我们可以将这个动态创建的对象传递给教师和学生的视图和渲染列表。

2。使用视图模型 ViewModel只是一个可能具有多个模型的类。它包含多个模型作为属性。它不应包含任何方法。

3。使用ViewData ViewData用于将数据从控制器传输到视图。 ViewData是一个字典对象,可以使用字符串作为键来访问它。使用ViewData,我们可以将任何对象从控制器传递到视图。在视图中枚举时,需要类型转换代码。

4。使用ViewBag ViewBag与ViewData相似,还用于将数据从控制器传输到视图。 ViewBag是一个动态属性。 ViewBag只是​​ViewData的包装。

5。使用元组 元组对象是不可变的,固定大小和有序的序列对象。它是一种具有特定数量和顺序的元素的数据结构。 .NET框架最多支持七个元素的元组。

6。使用渲染操作方法 局部视图定义或渲染视图内的局部视图。我们可以通过使用Html.RenderAction方法调用控制器操作方法来呈现视图的某些部分。当我们要在部分视图中显示数据时,RenderAction方法非常有用。这种方法的缺点是控制器只有多个调用。

有关更多详细信息,请参阅下面提到的link

答案 1 :(得分:0)

好吧,我只需要像这样修改我的代码,现在就可以了:

[Authorize]
[HttpGet]
public async Task<ActionResult> Index()
{
    ViewBag.sessionv = HttpContext.Session.GetInt32("idMember");
    FileMakerRestClient client = new FileMakerRestClient(serverName, fileName, userName, password);
    var toFind = new Models.EventsLines { Zkf_CTC = 1053 };
    var results = await client.FindAsync(toFind);

    var xtoFind = new Models.SubEventsLines { Zkf_CTC = 1053 };
    var xresults = await client.FindAsync(xtoFind);

    Models.EventViewModel oEventViewModel = new Models.EventViewModel
    {
        _EventsLines = (from o in results select o).ToList(),
        _SubEventsLines = (from x in xresults select x).ToList()
    };

    ViewBag.Zkf_CTC = 1053;
    return View(oEventViewModel);
}