c# - 如何在 foreach 循环中处理 NullReferenceException?
问题描述
我总是得到这个错误代码。我知道问题出在哪里,但我不知道为什么。我想我的模型是空的,但在我看来,它不是空的。错误代码:
处理请求时发生未处理的异常。NullReferenceException:对象引用未设置为对象的实例。
这里不对劲:@foreach(var emp in Model)
我的观点:
@model IEnumerable<CRUDDemo.Models.EmployeeInfo>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
@*For Display Employee Info*@
<table class="table table-striped">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Gender)
</th>
<th>
@Html.DisplayNameFor(model => model.Company)
</th>
<th>
@Html.DisplayNameFor(model => model.Department)
</th>
</tr>
</thead>
<tbody>
@foreach(var emp in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => emp.Name)
</td>
<td>
@Html.DisplayFor(modelItem => emp.Gender)
</td>
<td>
@Html.DisplayFor(modelItem => emp.Company)
</td>
<td>
@Html.DisplayFor(modelItem => emp.Department)
</td>
<td>
<a asp-action="Edit" asp-route-id="@emp.ID">Edit</a>
<a asp-action="Details" asp-route-id="@emp.ID">Details</a>
<a asp-action="Delete" asp-route-id="@emp.ID">Delete</a>
</td>
</tr>
}
</tbody>
</table>
我的模型:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace CRUDDemo.Models
{
public class EmployeeDAL
{
string connectionString = "Data Source=LENOVOL470\\SQLEXPRESS;Initial Catalog=EMPLOYEEDB;Persist Security Info=False;User ID=sa;password=123;";
//Get All
public IEnumerable<EmployeeInfo> GetAllEmployee()
{
List<EmployeeInfo> empList = new List<EmployeeInfo>();
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("SP_GetAllEmployee", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
EmployeeInfo emp = new EmployeeInfo();
emp.ID = Convert.ToInt32(dr["ID"].ToString());
emp.Name = dr["Name"].ToString();
emp.Gender = dr["Gender"].ToString();
emp.Company = dr["Company"].ToString();
emp.Department = dr["Department"].ToString();
empList.Add(emp);
}
con.Close();
}
return empList;
}
//To Insert Employee
public void AddEmployee(EmployeeInfo emp)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("SP_InsertEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Name", emp.Name);
cmd.Parameters.AddWithValue("@Gender", emp.Gender);
cmd.Parameters.AddWithValue("@Company", emp.Company);
cmd.Parameters.AddWithValue("@Department", emp.Department);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
//To Update Employee
public void UpdateEmployee(EmployeeInfo emp)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("SP_UpdateEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@EmpId", emp.ID);
cmd.Parameters.AddWithValue("@Name", emp.Name);
cmd.Parameters.AddWithValue("@Gender", emp.Gender);
cmd.Parameters.AddWithValue("@Company", emp.Company);
cmd.Parameters.AddWithValue("@Department", emp.Department);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
//To Delete Employeee
public void DeleteEmployee(int? empId)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("SP_DeleteEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@EmpId", empId);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
//Get Employee by ID
public EmployeeInfo GetEmployeeById(int? empId)
{
EmployeeInfo emp = new EmployeeInfo();
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("SP_GetEmployeeById", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@EmpId", empId);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
emp.ID = Convert.ToInt32(dr["ID"].ToString());
emp.Name = dr["Name"].ToString();
emp.Gender = dr["Gender"].ToString();
emp.Company = dr["Company"].ToString();
emp.Department = dr["Department"].ToString();
}
con.Close();
}
return emp;
}
}
}
我的控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AspNetCore;
using CRUDDemo.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
namespace CRUDDemo.Controllers
{
public class EmployeeController : Controller
{
EmployeeDAL employeeDAL = new EmployeeDAL();
public IActionResult Index()
{
List<EmployeeInfo> empList = new List<EmployeeInfo>();
empList = employeeDAL.GetAllEmployee().ToList();
return View(empList);
}
[HttpGet]
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create([Bind] EmployeeInfo objEmp)
{
if (ModelState.IsValid)
{
employeeDAL.AddEmployee(objEmp);
return RedirectToAction("Index");
}
return View(objEmp);
}
public IActionResult Edit(int? id)
{
if (id == null)
{
return NotFound();
}
EmployeeInfo emp = employeeDAL.GetEmployeeById(id);
if(emp == null)
{
return NotFound();
}
return View(emp);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(int? id, [Bind] EmployeeInfo objEmp)
{
if (id == null)
{
return NotFound();
}
if (ModelState.IsValid)
{
employeeDAL.UpdateEmployee(objEmp);
return RedirectToAction("Index");
}
return View(employeeDAL);
}
[HttpGet]
public IActionResult Details(int? id)
{
if (id == null)
{
return NotFound();
}
EmployeeInfo emp = employeeDAL.GetEmployeeById(id);
if (emp == null)
{
return NotFound();
}
return View(emp);
}
public IActionResult Delete(int? id)
{
if (id == null)
{
return NotFound();
}
EmployeeInfo emp = employeeDAL.GetEmployeeById(id);
if (emp == null)
{
return NotFound();
}
return View(emp);
}
[HttpPost,ActionName("Delete")]
[ValidateAntiForgeryToken]
public IActionResult DeleteEmp(int? id)
{
employeeDAL.DeleteEmployee(id);
return RedirectToAction("Index");
}
}
}
解决方案
因为你的emp
对象是空的。快速修复:添加if
条件以检查null
类似
@foreach(var emp in Model)
{
@if(emp != null)
{
// bind the properties to UI element
}
推荐阅读
- flutter - 在底部导航栏上添加行
- c - 如何在新的单链表中返回单链表的奇数索引节点?假设第一个节点的索引为 1
- android - 带有 MediaProjection 的 Android ImageReader:如何有效地删除图像额外的填充
- r - 从 Google 表格中读取包含表情符号的 CSV 失败
- django - 从引导选项卡重定向到另一个 Django
- javascript - 如何使用 javascript 在 json 中搜索指定的结果 [key + value]?
- vue.js - 如何在 Vue 的 v-model 中使用 Bootstrap 按钮组收音机?
- azure-devops - How to run pipeline from other pipeline?
- linux - CentOS 7 + Lighttpd,Web 服务器无法正常运行
- webdriver-io - CucumberJs cannot find steps using webdriverio5