我有一个包含许多部分视图的视图,我需要将匹配模型传递给每个视图。
我找到了两种方法来做到这一点,但我不知道应该做的真正方法是什么。
我想创建一个包含所有模型作为属性的大类,然后我可以将模型发送到每个局部视图。问题是它是硬类型的,如果我需要传递不同的模型组合,它不适合。
我想到的另一种方法是在每个模型中都有一个方法,为我提供每个局部视图的模型(GetMenuBar() 等)。
这样做的正确方法是什么?
我有一个包含许多部分视图的视图,我需要将匹配模型传递给每个视图。
我找到了两种方法来做到这一点,但我不知道应该做的真正方法是什么。
我想创建一个包含所有模型作为属性的大类,然后我可以将模型发送到每个局部视图。问题是它是硬类型的,如果我需要传递不同的模型组合,它不适合。
我想到的另一种方法是在每个模型中都有一个方法,为我提供每个局部视图的模型(GetMenuBar() 等)。
这样做的正确方法是什么?
我的建议是选择选项 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();
}
}
每个PartialViewXViewModel
都是它自己的 ViewModel,如果需要,可以在另一个视图中重用。
呈现的 Action 可能如下所示:
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
现在,每个 Partial view html 和他们使用的每个模型都可以在任何地方使用。
现在最重要的是,如果您有一个只需要其中两个的页面,您只需创建一个新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 中的首选设计策略,让 ViewModel 专门表示视图需要什么,并且只表示它需要什么。
您可能希望使用不同的方法来填充模型。这里的大多数人会推荐使用 Automapper。无论哪种方式,上面只是在 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);
}
这一切只会让您开始设计,您可以根据自己的内心进行调整:-)