单视图中的多个模型(C#MVC3)

cze*_*uya 14 c# asp.net-mvc asp.net-mvc-3

我正在使用C#和MVC3.

我有一个页面,例如学生列表,显示学生列表,这是由数据库驱动的.同时我的菜单是数据库驱动的,所以我也必须将它发送到视图.

如何将两个模型发送到单个视图?

nee*_*ebz 14

您应始终为视图创建单独的ViewModel.您的视图应该从您的域模型中抽象出来.在演示/教程中,他们通过简单地强烈键入视图到域模型来显示它非常简单,但这不是一个好策略.视图不应该依赖于业务对象.

即使需要将域模型映射到另一个视图模型类,您也应该为当前场景以及所有其他视图实现David Glenn提出的解决方案.

编辑:

如果你让我们说一个顶级菜单> TopMenu.aspx 你内部有多个局部视图> StudentMenu.ascx,ResultMenu.ascx

您将创建顶级菜单视图模型> TopMenuViewModel.cs ,你也将创建局部视图视图模型> StudentMenuViewModel,ResultMenuViewModel等等.

并且您的TopMenuViewModel将具有两个>

class TopMenuViewModel 
{
   //all the stuff required in TopMenu.aspx
   StudentMenuViewModel studentvm;
   ResultMenuViewModel resultvm;
}
Run Code Online (Sandbox Code Playgroud)

TopMenu.aspx渲染局部时,您将传递相关的视图模型>

Html.RenderPartial('StudentView', Model.studentvm)

希望它有意义


Dav*_*enn 10

您可以创建一个ViewModel,它代表您的视图,而不是您的业务模型

public class StudentPage {

  public IEnumerable<Student> Students { get; set; }

  public Menu Menu { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

然后,您的控制器将ViewModel返回到您的视图

public ViewResult Students() {

   var menu = GetMenu();
   var students = Repository.Students();

   var model = new StudentPage {
     Menu = menu,
     Students = students
   }

   return View(model);

}
Run Code Online (Sandbox Code Playgroud)

我假设菜单是你网页上的一个重复出现的功能,所以你可能想要分解它

public class BasePage {

  public Menu Menu { get; set; }

}

public class StudentPage : BasePage {

  public IEnumerable<Student> Students { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个基本控制器,它具有GetMenu()跨多个控制器重用的功能.