在视图中的模型中调用模型.(asp.net MVC)

本文关键字:模型 net MVC asp 调用 视图 | 更新日期: 2023-09-27 18:06:04

请记住,我是ASP的新手。净MVC。所以使用EF code first方法,我创建了2个模型,Movie和Producer:

public class Movie {
    public int ID {get;set;}
    public string Name {get;set;}
    public string Genre {get;set;}
    public Producer Producer {get;set;}
}
public class Producer {
    public int ID {get;set;}
    public string Name {get;set;}
    public DateTime DOB {get;set;}
    public List<Movie> Movies {get;set;}
}

在控制器类"Movies"中,我调用了一个视图:

public class MoviesController : Controller
{
//context just has DbSet< .. > of both classes.
MoviesContext db = new MoviesContext();
    public ActionResult Index()
    {
        var movies = from m in db.Movies
                     select m;
        return View(movies.ToList());
    }
}

但是如果我在视图中调用producer

@foreach(var item in Model)
{
    <p>@item.Producer.Name</p>
}

MVC崩溃与"对象引用不设置为对象的实例。"错误,即使当我看数据库,Producer_ID字段(代码第一次制作)被填写,所有生产者与相应的ID存在于数据库中。

我把值内的数据库手动,是什么会导致它?

任何帮助都是非常感激的!:)

在视图中的模型中调用模型.(asp.net MVC)

尝试通过调用函数Include()显式加载Producer数据

public ActionResult Index()
{
    var movies = from m in db.Movies.Include(b => b.Producer) 
                 select m;
    return View(movies.ToList());
}

如果延迟加载是启用的,你的属性Producer将加载第一次需要它。但是,如果延迟加载被禁用,则需要显式指定要加载其他相关实体。

接受lambda的方法Include是一个扩展方法,因此您需要在文件的顶部添加这个方法:

using System.Data.Entity;

另一种方法是使用string:

指定include
public ActionResult Index()
{
    var movies = from m in db.Movies.Include("Producer") 
                 select m;
    return View(movies.ToList());
}

结果是一样的,但是第一种方法不包含"魔法字符串",这通常是更可取的。

这是错误的,只需在返回前放置一个断点并检查是否电影。制作人不是空的,我打败了。你需要像这样包含生产者:

  var movies = from m in db.Movies.Include(m => m.Producer) 

或者可以与Producer表进行连接,参见这里的3表连接示例(在您的情况下只有2)