2014-09-23 137 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> 
相關問題