如果模型不相关,则在MVC视图中发送多个模型

时间:2013-11-05 09:05:34

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

如何将多个模型发送到View from Controller?

这似乎是一个被问过这么多次的问题,对我这样的新人来说仍然没有好的答案(我还没有找到)。

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

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

我有HomeController返回View。此视图显示两个部分视图。所以我需要将PersonModel发送给_PersonPartialView。我需要将HardwareModel发送给_HardwarePartialView

怎么做?

我相信应该有一个选项可以将不相关模型的集合发送给View,但究竟是怎么回事?

修改 一些解释:我们有复杂的决定,基于我们展示的两个部分观点。您可以像仪表板一样思考。用户可以看到一个更像“dashobard”的面板。所以他们甚至可能彼此无关。因此我们有超过2种不同的模型和不同的偏见,因此真实情况更复杂。 也许我应该有完全不同的方法。

3 个答案:

答案 0 :(得分:2)

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

class HomeModel
{
    PersonModel person;
    HardwareModel hardware;
}

你有你的模特。

<强>更新

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

加载此部分视图

如何执行此操作的示例click