-1

如何从控制器向视图发送多个模型?

这似乎是一个被问了很多次的问题,对于像我这样的新手仍然没有很好的答案(我没有找到它)。

我发现的一种解决方案是创建一些“父”模型并返回父子模型的集合。我不想创建任何父模型,因为我的两个模型彼此不相关。

例如,我有两个模型之间没有关系,它们是单独的模型,例如,PersonModelHardwareModel。我有两个部分视图,一个需要PersonModel,另一个需要HardwareModel

我有HomeController返回视图。此视图显示两个部分视图。所以我需要发送PersonModel_PersonPartialView. 我需要发送HardwareModel_HardwarePartialView.

这该怎么做?

我相信应该有一个选项可以将不相关模型的集合发送到 View,但究竟如何呢?

编辑: 一些解释:我们有复杂的决定,基于我们展示一个或两个部分观点的那些。你可以像仪表板一样思考。用户可以看到一个或多个类似面板的“仪表板”。因此,它们甚至可能彼此无关。所以实际情况更复杂,因为我们有超过 2 个不同的模型和不同的局部视图。也许我应该有完全不同的方法。

4

3 回答 3

2

如果 HomeView 同时需要 PersonModel 和 HardwareModel,那么这两个组合就是您的模型。所以创建例如

class HomeModel
{
    PersonModel person;
    HardwareModel hardware;
}

你有你的模型。

更新

根据问题更新,如果您有一个类似仪表板的页面,那么一种选择是取消当前拥有的主视图。有一个骨架视图,它定义了面板的位置,而不是它们的内容。然后使用 AJAX 调用请求部分视图来填充面板。这样,每个局部视图都有自己的模型,与其他模型分开,您可以避免一个视图需要了解它可能最终托管的所有局部视图的所有模型。

于 2013-11-05T09:13:03.067 回答
1

最后,我们将属于多个视图的抽象事物放入 ViewData / ViewBag 中,但不一定是每个模型(例如文化)的一部分。您仍然可以通过提供一个通过附加类封装视图包的扩展方法以强类型的方式访问它们。我建议将HardwareModel内容放入这些内容中,因为听起来这不是您网页上的主要内容。

public static HardwareSettings GetHardwareSettings (this HtmlHelper html)
{
  // simplified; add lazy instantiation...
  return (HardwareSettings) html.ViewData["hardware"];
}

这肯定是你能做的最好的。如果这不适合您的问题,我建议重新考虑您的架构,因为它可能存在一些缺陷。

于 2013-11-05T09:09:46.317 回答
0

如果此模型未链接,则不应从单个控制器方法返回它们。如果它应该显示在一个页面上,您可以使用ajax操作加载此部分视图

如何执行此操作的示例之一单击

于 2013-11-05T09:12:26.077 回答