我在阅读我对@foreach 的看法时遇到了这个错误。
异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。模型为空。
这是我的用户配置文件模型。
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.
请您参考如下方法:
您将收到 NullReferenceException
,因为您没有将强类型模型传递给您的 View 。因此,在您的 foreach
循环中,Model
为 null
。正常的做法是这样的:
return View(model);
真正的问题是您在这里混合了不同的概念。您正在尝试以强类型方式访问模型的属性,但您正在定义 ViewBag.Model
属性,该属性是动态的并且与 没有任何关系 View 中的模型
属性。
如果您想以强类型的方式访问您的模型,并且这当然是我建议您这样做的方式,您需要进行几处更改。我建议您首先定义一个 View 模型来表示 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
之前评估查询。
最后,您只需要对您的 View 进行一项更改:
@model List<UserProfileViewModel>
@foreach (var item in Model)
{
// rest of code goes here
}
@model
指令指定 View 应该接收的确切模型类型,从而使其成为强类型。