控制器代码:
public ActionResult Edit(int id)
{
Users result = null;
using (MyApplicationContext context = new MyApplicationContext())
{
ViewBag.Conditions = context.Conditions.Where(x => x.IsActive).OrderBy(x => x.Name).ToList();
result = context.Users.FirstOrDefault(x => x.Id == id);
}
return View("Manage", result);
}
在视图中,Manage。在cshtml中,我有以下代码:
@using MyApplicationContext.Models
@model MyApplication.Models.Users
@{
ViewBag.Title = "Manage";
List<MyApplication.Models.Condition> conditionList = ViewBag.Conditions;
foreach (var condition in conditions)
{
bool isChecked = Model.Conditions.Any(x => x.Id == condition.Id) ? true : false;
}
代码在foreach循环中对isChecked赋值失败,但在编辑器中,模型描述是'获取关联的viewdatadiictionary对象的Model属性。
我不明白这是如何与ObjectContext对象绑定的。当我删除它时,引用model的代码(来自@model的小写字母)就成功了。
谢谢你,
核心原因是User。Conditions是一个延迟加载的导航,并且您的数据上下文(和底层连接)已经在视图中关闭。
解决这个问题的快速方法是确保条件被用户加载。
// Include this namespace:
using System.Data.Entity;
然后修改结果查询:
result = context.Users
.Include(u => u.Conditions) // <-- Instruct the query to also load Conditions.
.FirstOrDefault(x => x.Id == id);
你已经传入了一个类型为'Users'的模型,我假设它有一个名为Conditions的导航属性。导航属性将查询数据库。
看起来你想写conditionList.Any(x => x.Id == condition.Id) ? true : false;
代替Model。条件,就像你已经列出的条件列表一样。(使用ToList()将在该点查询数据库,从而避免此问题)
如果你确实需要导航属性,你也可以考虑像result.Conditions.ToList()那样将其扁平化,并使用它来代替Model。条件属性。