簡體   English   中英

在asp.net MVC 4中具有兩個模型的單個視圖

[英]A single view with two models in asp.net MVC 4

我在模態中有一個名為movie.cs的類,如下所示。

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; }
    }
}

現在我想在同一視圖中訪問電影和學生的數據。但是我也無法訪問任何一個的數據。

在控制器中我有

 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 />

}

您需要的是ViewModel。 Viewmodel類包含要在案例中顯示的那些類:電影和學生。 它可以僅用於包裝所需的信息,也可以用作更復雜數據的包裝。

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

現在,您的Index方法應該返回您的Viewmodel:

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

    return View(vm);
}

之后,建立您的View:

@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)
{
  @* ... *@
}

更多信息:

這種東西的一個好習慣是使用所謂的“ 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

您可以使用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>

發生這種情況的原因是,您希望在視圖中看到MovieContext,並且正在傳遞Movie模型,因此請嘗試使viewmodel如下所示:-

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

並查看:-

 @model CodFirst.Models.ViewModel

@{
    ViewBag.Title = "Index";
}

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM