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



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

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

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

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

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

如何做到这一点?

我认为应该有一个选项可以将不相关模型的集合发送到View,但具体如何发送?

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

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

class HomeModel
{
    PersonModel person;
    HardwareModel hardware;
}

你就有了自己的模特。

更新

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

我们最终将抽象的东西放入ViewData/ViewBag中,这些东西是几个视图的一部分,但不一定是每个模型(例如,区域性(的一部分。您仍然可以通过提供一个扩展方法以强类型的方式访问它们,该方法通过一个额外的类封装视图包。我建议把HardwareModel的东西放进这些中,因为听起来它不是你网页上的主要内容

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

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

如果这个模型没有链接,就不应该从单个控制器方法返回它们。如果它应该显示在一个页面上,你可以用ajax动作加载这个部分视图

其中一个例子如何做到这一点点击

最新更新