【问题标题】:Calling a model within a model in a view. (asp.net MVC)在视图中的模型中调用模型。 (asp.net MVC)
【发布时间】:2015-08-03 17:28:24
【问题描述】:

请记住,我对 ASP.NET MVC 还是很陌生。所以使用 EF 代码优先的方法,我创建了 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;}
}

在控制器类“电影”中,我调用了一个视图:

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

但是如果我在视图中调用生产者

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

MVC 崩溃并显示“对象引用未设置为对象的实例”。错误,即使当我查看数据库时,Producer_ID 字段(代码首先创建的)已填写,并且具有相应 ID 的所有生产者也存在于数据库中。

我确实手动将值放入数据库中,这是什么原因造成的?

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc database entity-framework


    【解决方案1】:

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

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

    如果启用延迟加载,您的属性Producer 将在第一次需要时加载。但是,如果禁用延迟加载,则需要明确指定要加载其他相关实体。

    Include that accepts a lambda 方法是一个扩展方法,所以你需要在文件顶部添加这个 using:

    using System.Data.Entity;
    

    另一种方法是使用字符串指定包含:

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

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

    【讨论】:

    • 我不能再接受 4 分钟的答案。它工作得很好。我只想指出(对于未来的观众)您需要包含 System.Data.Entity。非常感谢您的回答! :) 我想问一下,如果我有另一个模型(例如 public MainActor MainActor {get;set;} ),我可以同时包含两者吗? (var movies = from m in db.Movies.Include(p => p.Producer).Include(ma => ma.MainActor))?
    【解决方案2】:

    这是错误的,只需在返回前放一个断点并检查movies.Producer是否不为空,我击败yes.. 您需要像这样包含生产者:

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

    或者可能与 Producer 表进行联接,请参阅 3 表联接示例(在您的情况下只有 2 个)here

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2010-11-18
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多