2014-09-23 79 views
0

我有一个叫做movie.cs的类,它的模式如下。在asp.net中有两个模型的单一视图MVC 4

namespace CodFirst.Models 
{ 
    public class Movie 
    { 
     public int MovieId { get; set; } 
     public string name { get; set; } 

     public string genre { get; set; } 
    } 

    public class Student 
    { 

     public int StudentId { get; set; } 
     public string fname { get; set; } 
     public string lname { get; set; } 
    } 

} 

,我已经在一个名为moviecontext为同一模式的上下文类:

namespace CodFirst.Models 
{ 
    public class MovieContext:DbContext 
    { 
     public DbSet<Movie> Movies { get; set; } 
     public DbSet<Student> Students { get; set; } 
    } 
} 

现在我想访问同一view.But电影和学生的数据我不能够访问任何一个的数据。

在控制器我有

MovieContext db = new MovieContext(); 

    public ActionResult Index() 
    { 
     //db.Movies.ToList(); 
     var myvar = db.Movies; 

     return View(myvar); 
    } 

最后的观点如下:

@model CodFirst.Models.MovieContext 

@{ 
    ViewBag.Title = "Index"; 
} 

@foreach(var item in Model.Movies) 
{ 
    @Html.DisplayName("movie: ") @item.name; @Html.DisplayName(" type: ") @item.genre; <br /> 

} 
+0

你如何试图访问他们与你在哪里失败与错误?你有没有尝试过搜索“ViewModels”? 另请参见:视图中的模型应该是Movie类型,而不是MovieContext。 – Marco 2014-09-23 06:29:36

+0

起初我试图访问onyone..With @ modal.projectname.Modals.movi​​e我只能访问电影中的数据,但不能从学生访问。 – suman 2014-09-23 06:33:17

回答

3

你需要的是一个ViewModel。 Viewmodel类包含您想要在您的案例中显示的类:电影和学生。它只能用来包装你需要的信息或成为更复杂数据的包装。

public class MovieStudentVM 
{ 
    public IEnumerable<Movie> Movies { get; set; } 
    public IEnumerable<Student> Students { get; set; } 
} 

索引方法现在应该回到您的视图模型:

public ActionResult Index() 
{ 
    var vm = new MovieStudentVM(); 
    vm.Movies = db.Movies; 
    vm.Students = db.Students; 

    return View(vm); 
} 

在此之后刚刚建立自己的看法:

@model CodFirst.Models.MovieStudentVM 

@foreach(var item in Model.Movies) 
{ 
    @Html.DisplayName("movie: ") @item.name; @Html.DisplayName(" type: ") @item.genre; <br /> 
} 

@foreach(var item in Model.Students) 
{ 
    @* ... *@ 
} 

更多信息:

+0

分贝你已经使用是从moviecontext类权利。请你可以告诉我viewmodal和上下文类之间的区别。 – suman 2014-09-23 06:50:40

+0

dbcontet类负责与驻留在数据库中的数据进行交互。 ViewModel只是数据外观的蓝图。参考:http://msdn.microsoft.com/en-us/data/jj729737.aspx – Marco 2014-09-23 06:57:17

0

它的发生,因为你期待在视图MovieContext和你逝去的电影模式,使尝试使视图模型如下面的代码所示: -

public class ViewModel 
{ 
    public IEnumerable<Movie> Movies { get; set; } 
    public IEnumerable<Student> Students { get; set; } 
} 

and view: -

@model CodFirst.Models.ViewModel 

@{ 
    ViewBag.Title = "Index"; 
} 

@foreach(var item in Model.Movies) 
{ 
    @Html.DisplayName("movie: ") @item.name; @Html.DisplayName(" type: ") @item.genre; <br /> 

} 
+0

我看不出它的区别......它只是我有类名称moviecontext,你有班级名称Viewmodal.Other比那是什么区别 – suman 2014-09-23 06:40:01

+0

你确定你想建立一个由DbSet <>'组成的ViewModel吗? – Marco 2014-09-23 06:41:28

+0

它是错误的@Serv – Neel 2014-09-23 06:50:28

2

这种东西的一个很好的做法是使用所谓的'ViewModels'。定义保存你的数据,你想在您的视图访问一个新的模式:

MyViewModel:

public class MyViewModel { 
    public IEnumerable<Movie> Movies { get; set; } 
    public IEnumerable<Student> Students { get; set; } 
} 

控制器:

public ActionResult Index() 
{ 
    var model = new MyViewModel { 
     Movies = db.Movies.ToList(), 
     Students = db.Students.ToList() 
    } 
    return View(model); 
} 

,那么该观点:

@model CodFirst.Models.MyViewModel 

// your view stuff 
1

你可以去View Model,但是如果你真的想在这里使用Tuple,你可以去

public class ToupleController : Controller 
{ 
    public ActionResult Index() 
    { 
     var first = new FirstModel(); 
     var second = new SecondModel(); 

     return View(Tuple.Create(first,second)); 
    } 
} 

,并在您的视图

@model Tuple<FirstModel, SecondModel> 
    <div> 
     @Html.TextBoxFor(x => x.Item1.Prop1) 
     @Html.TextBoxFor(x => x.Item1.Prop2) 
    </div> 
    // to access your second model 
    <div> 
     @Html.TextBoxFor(x => x.Item2.Prop1) 
     @Html.TextBoxFor(x => x.Item2.Prop2) 
    </div>