许多模型可以查看许多部分视图

Avi*_*hen 2 c# asp.net-mvc asp.net-mvc-3

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

我找到了两种方法来做到这一点,但我不知道它应该采取什么样的方式.

  1. 我想创建包含所有模型作为属性的大类,而不是将模型发送到每个局部视图.问题是它的硬打字,如果我需要通过不同的模型组合,它不适合.

  2. 我的另一种方法是在每个模型中有一个方法,为每个局部视图(GetMenuBar()等提供模型).

这样做的正确方法是什么?

CD *_*ith 10

我的建议,与选项1一起使用.我在所有主视图/多部分视图方案中使用它.它很容易维护,因为每个部分都拥有自己的ViewModel.它使整个事物保持干净整洁

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

渲染的动作可能如下所示:

public ActionResult Index {
    var model = new MainViewModel();
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

你的观点

@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>
Run Code Online (Sandbox Code Playgroud)

为每个人定义UI PartialX:

@model Partial1ViewModel

//view html here
Run Code Online (Sandbox Code Playgroud)

现在,每个部分视图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();
    }
}
Run Code Online (Sandbox Code Playgroud)

并在另一个视图中使用它:

public ActionResult SomeOtherAction {
    var model = new OtherMainViewModel();
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

这是完全可以接受的,也是MVC中首选的设计策略,使ViewModel能够专门代表视图需要的内容以及它所需要的内容.

您可能希望使用不同的方法来填充模型.大多数人会建议使用Automapper.无论哪种方式,上面只是在MainViewModel的构造函数中初始化PartialViewXModel.如果您使用数据库中的数据填充这些模型,则不一定是您的情况.你会想要自己的策略.这可以在这里工作:

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);
}
Run Code Online (Sandbox Code Playgroud)

这一切都只是让你开始设计,你可以调整它的心脏内容:-)