在视图中的模型中调用模型.(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存在于数据库中。
我把值内的数据库手动,是什么会导致它?
任何帮助都是非常感激的!:)
尝试通过调用函数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:
指定includepublic 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)