我在阅读@foreach上的观点时遇到此错误。
异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。模型为空。
这是我的userprofile模型。
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet<Secretarias> Secretarias { get; set; }
public DbSet<Secretarias_Direcciones> Secretarias_Direcciones { get; set; }
}
[Table("UserProfile")]
public class UserProfile
{
[Key]
public int UserId { get; set; }
[Required]
public string Nombre { get; set; }
[Required]
public int SecretariaId { get; set; }
[Required]
public int DireccionId { get; set; }
[Required]
public string UserName { get; set; }
}
这是我的控制
public ActionResult ListaUsuarios()
{
UsersContext db = new UsersContext();
var model = from usrs in db.UserProfiles
select new { usrs.UserId, usrs.Nombre, usrs.UserName, usrs.SecretariaId, usrs.DireccionId };
ViewBag.Model = model.ToList();
return View();
}
这是我的观点
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserId)
</td>
<td>
@Html.DisplayFor(modelItem => item.Nombre)
</td>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.SecretariaId)
</td>
<td>
@Html.DisplayFor(modelItem => item.DireccionId)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.UserId }) |
@Html.ActionLink("Details", "Details", new { id=item.UserId}) |
@Html.ActionLink("Delete", "Delete", new { id=item.UserId })
</td>
</tr>
}
以下是例外详情:
System.NullReferenceException: Object reference not set to an instance
of an object. Model is null.
答案 0 :(得分:7)
您获得的是NullReferenceException
,因为您尚未将强类型模型传递给您的视图。因此,在foreach
循环中,Model
为null
。正常的做法是这样的:
return View(model);
真正的问题是你在这里混合了不同的概念。您尝试以强类型方式访问模型的属性,但是您正在定义ViewBag.Model
属性,该属性是动态的,并且与Model
属性无关。图。
如果您想以强类型方式访问模型,这肯定是我建议您这样做的方式,您需要进行一些更改。我建议您首先定义一个视图模型来表示UserProfile
:
public class UserProfileViewModel
{
public int UserId { get; set; }
public string Nombre { get; set; }
public int SecretariaId { get; set; }
public int DireccionId { get; set; }
public string UserName { get; set; }
}
现在,更改您的操作以创建以下列表:
public ActionResult ListaUsuarios()
{
using (UsersContext db = new UsersContext())
{
var model = from usrs in db.UserProfiles
select new UserProfileViewModel
{
UserId = usrs.UserId,
Nombre = usrs.Nombre,
UserName = usrs.UserName,
SecretariaId = usrs.SecretariaId,
DireccionId = usrs.DireccionId
};
return View(model.ToList());
}
}
请注意,我在这里做了一些更改。首先,我添加了using
语句,以确保正确处理UsersContext
。接下来,我已将查询更改为实例化UserProfileViewModel
,而不是匿名类型。最后,我将model
作为参数直接传递给View()
,确保在其上调用ToList()
,以便在UsersContext
处置之前评估查询。< / p>
最后,您只需对视图进行一次更改:
@model List<UserProfileViewModel>
@foreach (var item in Model)
{
// rest of code goes here
}
@model
指令指定视图应该接收的确切模型类型,从而使其强类型化。
答案 1 :(得分:1)
显然 - 检查用于在数据库中执行连接的每个ID的数据类型。还要确保将数据库数据类型映射到正确的.Net数据类型。
如果您的ID字段的数据类型看起来没问题,我建议缩小哪个连接导致错误。修改LINQ表达式以使其具有单个连接并确保没有错误。一次添加其他连接,直到出现错误。
答案 2 :(得分:0)
对于您的型号,请检查它是否正在填充。 根据发生的情况,可能是您的模型只是null 可能它的类型可能是不期望的东西。
- 在控制器中,模型上下文引用上的foreach循环将允许您查看值