簡體   English   中英

ASP.NET MVC“'對象引用未設置為 object 的實例。'”錯誤

[英]ASP.NET MVC "'Object reference not set to an instance of an object.'" Error

我正在制作一個頁面,在這個頁面上有一個表格。 我想從表中過濾Name 我寫了這樣的代碼:

Index.cshtml

@using StudentApp.Models.Entity
@model List<StudentTable>
@{
    ViewData["Title"] = "Manage Student";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<br />
<h1>Manage Student</h1>
<br />
@using (Html.BeginForm("Index", "Students", FormMethod.Get))
{
    <p>
        <b>Student Name:</b> @Html.TextBox("p");
        <input type="submit" value="Ara">
    </p>
}
<table id="tbl1" class="table table-bordered">
    <tr>
        <th>
            Student ID
        </th>
        <th>
            Student Name
        </th>
        <th>
            Student Class
        </th>
        <th>
            Edit
        </th>
        <th>
            Delete
        </th>
    </tr>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @item.Id
                </td>
                <td>
                    @item.Name
                </td>
                <td>
                    @item.Class.ClassName // Error
                </td>
                <td>
                    <a href="/StudentTable/EditStudent/@item.Id" class="btn btn-success">Edit</a>
                </td>
                <td>
                    <a href="/StudentTable/Delete/@item.Id" class="btn btn-danger">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

<a href="/StudentTable/AddStudent"  class="btn btn-primary">Add Student</a>


<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link href="~/lib/bootstrap/dist/css/bootstrap.css" rel="stylesheet" />
<link href="https://cdn.datatables.net/1.10.15/css/dataTables.bootstrap.min.css" rel="stylesheet" />
<link href="https://cdn.datatables.net/responsive/2.1.1/css/responsive.bootstrap.min.css" rel="stylesheet" />
<script src="https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap4.min.js "></script>  

<script>
    $('#tbl1').dataTable({});
</script>

StudentController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using StudentApp.Models.Entity;
using System.Linq;

namespace StudentApp.Controllers
{
    public class StudentTableController : Controller
    {
        StudentDatabaseContext db = new StudentDatabaseContext();
        public IActionResult Index(string p)
        {
            var degerler = from d in db.StudentTables select d;
            if (!string.IsNullOrEmpty(p))
            {
                degerler = degerler.Where(m => m.Name.Contains(p));
            }
            return View(degerler.ToList());
        }
        [HttpGet]
        public ActionResult AddStudent()
        {
            List<SelectListItem> GetClass = new List<SelectListItem>();
            foreach (var item in db.ClassTables.ToList())
            {
                GetClass.Add(new SelectListItem { Text = item.ClassName, Value = item.Id.ToString() });
            }
            ViewBag.ClassList = GetClass;
            return View(new StudentTable());
        }
        [HttpPost]
        public ActionResult AddStudent(StudentTable st)
        {
            db.StudentTables.Add(st);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        public IActionResult Delete(int id)
        {
            var student = db.StudentTables.SingleOrDefault(i => i.Id == id);
            db.StudentTables.Remove(student);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        [HttpGet]
        public ActionResult EditStudent(int id)
        {
            var info = db.StudentTables.SingleOrDefault(i => i.Id == id);
            List<SelectListItem> GetClass = new List<SelectListItem>();
            foreach (var item in db.ClassTables.ToList())
            {
                GetClass.Add(new SelectListItem { Text = item.ClassName, Value = item.Id.ToString() });
            }
            ViewBag.ClassT = GetClass;
            return View("EditStudent", info);

        }
        [HttpPost]
        public ActionResult EditStudent(StudentTable p)
        {
            var StudentT = db.StudentTables.SingleOrDefault(i => i.Id == p.Id);
            StudentT.Name = p.Name;
            StudentT.ClassId = p.ClassId;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
}

StudentTable.cs

using System;
using System.Collections.Generic;

namespace StudentApp.Models.Entity
{
    public partial class StudentTable
    {
        public int Id { get; set; }
        public string? Name { get; set; }
        public int ClassId { get; set; }

        public virtual ClassTable? Class { get; set; }
    }
}

當我運行代碼時,我在Index.cshtml頁面上收到以下錯誤:

在此處輸入圖像描述

為什么會這樣? 如何修復錯誤? 在此先感謝您的幫助。

您需要預先 加載StudentTable實體以加載其相關的Class實體。

public IActionResult Index(string p)
{
    ...

    return View(degerler
        .Include(x => x.Class)
        .ToList());
}

雖然Class屬性在StudentTable中是可為空的類型,但使用?. 用於防止在父級為null時訪問內部屬性的空條件運算符

看法

@item.Class?.ClassName

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM