例如我有模特:
Student
和Course
。
Student
有一个List<Course> Courses{get;set;}
所有数据都已从网络服务中填充
我有一个Student/Index
,它返回一个StudentViewModel
的ActionResult
但是我还有一个Course/Index
视图,它返回一个ActionResult需要CourseViewModel
这应该为我的问题奠定基础:
如果我遵循这个选项,我觉得它非常简洁:
在ViewModel
视图
Student/Index
的实例
@foreach(var course in Model.Courses)
{
Html.RenderPartial("path/tocourse",
new CourseViewModel{Course = course}) ;
}
或者我应该让StudentViewModel
拥有List<CourseViewModel>
,所以我可以:
@foreach(var courseViewModel in Model.CourseViewModels)
{
Html.RenderPartial("path/tocourse", courseviewModel) ;
}
乍一看,上面的内容可能看起来更好,但在Index
动作(或其他)中,它需要我执行以下操作:
new StudentViewModel{
CourseViewModels = courses.Select(c=>new CourseViewModel{copy stuff}).ToList()
}
我讨厌这一点,而且以后可能会让我感到困惑,或者另一个开发人员看到另一个间接让我可以访问课程,StudentViewModel.StudentModel.Courses
。
那么哪种方法更好?当然,在ViewModel
中创建Model
或View
的实例是不是
答案 0 :(得分:4)
这样做完全没问题。它不被视为最佳实践。最佳实践是在视图中尽可能少地处理或实例化。
为了SOC,我会重新考虑此代码以使用Partials with Child Action Methods
Html.Action("path/tocourse");
Child Action将实例化并传递模型,从而减轻你的观点。
[ChildActionOnly]
public ActionResult tocourse()
{
courseviewModel model = new courseviewModel();
return PartialView(model);
}
答案 1 :(得分:0)
理想情况下,您的视图不应具有任何viewmodel实例逻辑,而控制器应该执行所有这些操作并将该模型提供给视图。视图应该干净。并且viewmodel应该只具有视图所需的那些属性。现在,您可以拥有一个足够复杂的模型,但如果您发现某个特定模型对于您的视图非常复杂,只需创建一个特定于该视图的视图模型,其视图需要的属性有限。