"对象引用未设置为对象的实例"当试图在foreach循环中使用if语句时

时间:2015-02-09 07:41:10

标签: c# asp.net asp.net-mvc razor foreach

我有一张表格,显示学生每次注册课程。我有一个foreach循环遍历学生的所有注册

@foreach (var item in Model.Enrollments)
{
    <tr>
        <td> @Html.DisplayFor(modelItem => item.Course.CourseID) </td>
        <td> @Html.DisplayFor(modelItem => item.Course.Title) </td>
        <td> @Html.DisplayFor(modelItem => item.Course.Type) </td>
        <td> @Html.DisplayFor(modelItem => item.Status) </td>
    </tr>     
}

现在这样可以正常运行,但是当我尝试使用if语句只显示具有某种类型的课程时

@foreach (var item in Model.Enrollments)
{
if (item.Course.Type == "Basic Core") 
   {
    <tr>
        <td> @Html.DisplayFor(modelItem => item.Course.CourseID) </td>
        <td> @Html.DisplayFor(modelItem => item.Course.Title) </td>
        <td> @Html.DisplayFor(modelItem => item.Course.Type) </td>
        <td> @Html.DisplayFor(modelItem => item.Status) </td>
    </tr>
   }                              
}

我得到了

  

“对象引用未设置为对象的实例。”第115行的错误

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

     

来源错误:

Line 113:{
Line 114:
Line 115:    if (item.Course.Type == "Basic Core") {
Line 116:        <tr>
Line 117:            <td> @Html.DisplayFor(modelItem => item.Course.CourseID) </td>

根据我的理解,foreach循环会跳过任何null对象(如果有的话)。任何帮助将不胜感激。

这是我的控制器

public ActionResult Details(int? StudentID)
{
    if (StudentID == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Student student = db.Students.Find(StudentID);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

1 个答案:

答案 0 :(得分:0)

正如Code的Coder所指出的那样,你有一个包含一个Course对象设置为null的item对象。

由于item对象不为null,因此它从枚举中获取。然后在检查内部Course对象时,它抛出异常,因为它为null。为了避免在评估对象之前检查null,如下所示:

@foreach (var item in Model.Enrollments)
{
if (item.Course != null && item.Course.Type == "Basic Core") 
   {
    <tr>
        <td> @Html.DisplayFor(modelItem => item.Course.CourseID) </td>
        <td> @Html.DisplayFor(modelItem => item.Course.Title) </td>
        <td> @Html.DisplayFor(modelItem => item.Course.Type) </td>
        <td> @Html.DisplayFor(modelItem => item.Status) </td>
    </tr>
   }                              
}

您还可以调试剃刀代码,以查看在需要时发生了什么。