@foreach model为null:System.NullReferenceException:未将对象引用设置为对象的实例

时间:2013-12-18 18:00:55

标签: linq asp.net-mvc-4

我在阅读@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.

3 个答案:

答案 0 :(得分:7)

您获得的是NullReferenceException,因为您尚未将强类型模型传递给您的视图。因此,在foreach循环中,Modelnull。正常的做法是这样的:

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循环将允许您查看值