我在阅读我对@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 循环中,Modelnull。正常的做法是这样的:

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 应该接收的确切模型类型,从而使其成为强类型。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!