许多模型可以通过许多部分视图进行查看

本文关键字:视图 模型 可以通过 许多部 许多 | 更新日期: 2023-09-27 18:35:22

我有一个包含许多部分视图的视图,我需要将匹配的模型传递给每个视图。

我找到了 2 种方法来做到这一点,但我不知道应该这样做的真正方法是什么。

  1. 我想创建包含所有模型作为属性的大类,然后我可以将模型发送到每个分部视图。 问题是它的硬类型,如果我需要传递不同的模型组合,它就不适合。

  2. 我的另一种方法是在每个模型中都有一个方法,为我带来每个部分视图的模型(GetMenuBar() 等)。

正确的方法是什么?

许多模型可以通过许多部分视图进行查看

我的建议是,选择选项 1。我将其用于我的所有主视图/多个部分视图方案。它易于维护,因为每个部分都有自己的视图模型。它保持了整个东西的美好和干净

我使用完全相同的设置,如下所示:

public class MainViewModel {
    public Partial1ViewModel Partial1 [ get; set; }
    public Partial2ViewModel Partial2 [ get; set; }
    public Partial3ViewModel Partial3 { get; set; }
    public Partial4ViewModel Partial4 { get; set; }
    public MainViewModel() {}
    public MainViewModel() {
        Partial1 = new Partial1ViewModel();
        Partial2 = new Partial2ViewModel();
        Partial3 = new Partial3ViewModel();
        Partial4 = new Partial4ViewModel();
    }
}

每个PartialViewXViewModel都是它自己的视图模型,如果需要,可以在另一个视图中重用。

呈现的操作可能如下所示:

public ActionResult Index {
    var model = new MainViewModel();
    return View(model);
}

您的观点

@model MainViewModel
<div>
    {@Html.RenderPartial("PartialOne", Model.Partial1)}
</div>

<div>
    {@Html.RenderPartial("PartialTwo", Model.Partial2)}
</div>

<div>
    {@Html.RenderPartial("PartialThree", Model.Partial3)}
</div>

<div>
    {@Html.RenderPartial("PartialFour", Model.Partial4)}
</div>

为每个PartialX定义 UI,例如:

@model Partial1ViewModel
//view html here

现在,每个部分视图 html 和它们使用的每个模型都可以在任何地方使用。

现在最重要的是,如果您有一个只需要其中 2 个的页面,您只需创建一个新ViewModel来表示该特定视图,如下所示:

public class OtherMainViewModel {
    public Partial2ViewModel Partial2 [ get; set; }
    public Partial4ViewModel Partial4 { get; set; }
    public OtherMainViewModel() {}
    public OtherMainViewModel() {
        Partial2 = new Partial2ViewModel();
        Partial4 = new Partial4ViewModel();
    }
}

并在另一个视图中使用它,如下所示:

public ActionResult SomeOtherAction {
    var model = new OtherMainViewModel();
    return View(model);
}

这是完全可以接受的,也是MVC中的首选设计策略,让ViewModels专门表示视图需要什么,并且只表示它需要什么。

您可能希望使用其他方法来填充模型。这里的大多数人建议使用自动映射器。无论哪种方式,上述内容都只是在 MainViewModel 的构造函数中初始化 PartialViewXModels。如果您使用数据库中的数据填充这些模型,则不一定是这种情况。你会想要你自己的策略。这将在这里工作:

public ActionResult Index {
    var model = new MainViewModel();
    model.Partial1 = GetPartial1Data(); // this method would return Partial1ViewModel instance
    model.Partial2 = GetPartial2Data(); // same as above for Partial2ViewModel
    ...
    return View(model);
}

这一切都会让你开始设计,你可以根据自己的喜好进行调整:-)