【问题标题】:Facing Object reference not set exception even though operation succeeding [duplicate]即使操作成功,面对对象引用也没有设置异常[重复]
【发布时间】:2018-10-16 17:18:56
【问题描述】:

每次我尝试输入新课程时都会收到以下错误。


对象引用未设置为对象的实例。 AspNetCore._Views_Admin_Manage_cshtml+d.MoveNext() 在 Manage.cshtml 中,第 34 行


这是我的控制器:

using ASP_Project.Data;
using ASP_Project.Models;
using ASP_Project.Services.Interfaces;
using ASP_Project.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace ASP_Project.Controllers
{
    public class AdminController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly SchoolContext _schoolContext;
        private readonly IAdminRepository _adminRepos;
        private readonly ITeacherRepository _teacherRepository;

        public AdminController(UserManager<ApplicationUser> userManager,
            SchoolContext schoolContext,
            IAdminRepository adminRepos,
            ITeacherRepository teacherRepository
            )
        {
            _userManager = userManager;
            _schoolContext = schoolContext;
            _adminRepos = adminRepos;
            _teacherRepository = teacherRepository;
        }

        [HttpGet]
        [Authorize(Roles = "Admin")]
        public async Task<IActionResult> Index()
        {
            ClaimsPrincipal currentUser = User;
            var user = await _userManager.GetUserAsync(currentUser);
            var admin = _adminRepos.GetAdminByUser(user);

            return View(new AdminViewModel()
            {
                FirstName = admin.FirstName,
                LastName = admin.LastName,
                MiddleName = admin.MiddleName
            });
        }

        [HttpGet]
        public IActionResult Manage()
        {
            IEnumerable<string> teachers = _teacherRepository.TeacherNames();
            return View(new CourseViewModel()
            {
                Teachers = teachers
            });
        }

        [HttpPost]
        public async Task<IActionResult> Manage(CourseViewModel courseViewModel)
        {
            var teacher = _schoolContext.Teacher.Single(t => t.FirstName == courseViewModel.TeacherName);
            Course course = new Course()
            {
                CodeID = courseViewModel.CodeID,
                Name = courseViewModel.Name,
                NumOfCredits = courseViewModel.NumOfCredits,
                TeacherID = teacher.TeacherID
            };
            await _schoolContext.Course.AddAsync(course);
            if (await _schoolContext.SaveChangesAsync() == 0)
                return RedirectToAction("Index", "Admin");
            return View(courseViewModel);
          }
       }
  }

这是我的观点:

@model ASP_Project.ViewModels.CourseViewModel
@{
    ViewData["Title"] = "Manage";
}

<h2>Manage</h2>

<div class="row">
    <div class="col-md-4">
        <form asp-controller="Admin" asp-action="Manage" method="post" class="form-horizontal" role="form">
            <h4>Create a new Course.</h4>
            <hr />
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="CodeID"></label>
                <input asp-for="CodeID" class="form-control" />
                <span asp-validation-for="CodeID" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Name"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="NumOfCredits"></label>
                <input asp-for="NumOfCredits" class="form-control" />
                <span asp-validation-for="NumOfCredits" class="text-danger"></span>
            </div>
            <div>
                <label asp-for="TeacherName" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <select asp-for="TeacherName" class="form-control" required>
                        <option value="" disabled selected>Select Teacher</option>
                        @foreach (var teach in Model.Teachers)
                        {
                            <option value="@teach"> @teach </option>
                        }
                    </select>
                    <span asp-validation-for="TeacherName" class="text-danger"></span>
                </div>
            </div>

            <button type="submit" class="btn btn-default">Add</button>
        </form>
    </div>
</div>
@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}

我的 CourseViewModel:

using ASP_Project.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace ASP_Project.ViewModels
{
    public class CourseViewModel
    {
        [Required]
        public string CodeID { get; set; }
        [Required]
        public int NumOfCredits { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string TeacherName { get; set; }
        public IEnumerable<string> Teachers { get; set; } 
    }
}

最后是用于检索教师姓名的函数:

public IEnumerable<string> TeacherNames() => _schoolContext.Teacher.Select(t => t.FirstName);

我从异常中了解到的是,要么有一部分 foreach 需要等待,要么没有定义其中一个对象。

请注意,该操作仍在成功完成其工作,并且正在将数据添加到数据库中,只是这个奇怪的异常不断出现。 编辑:尽管@NoCodeFound 回答指出我应该调试(这就是我为找到答案所做的)但我还是打算这样做,而且我碰巧发现了真正的原因。

【问题讨论】:

  • 这似乎很有帮助,但我的问题似乎有点奇怪,因为我无法真正将其与特定原因联系起来。
  • 它说错误在您视图的第 34 行,它正在迭代 Model.Teachers,这很可能是 null。我会确保您将正确的对象传递给View(courseViewModel)
  • 但是选择显示我需要的名称以及在按下提交后更新数据库。问题是它显示异常,即使没有任何内容显示为空。

标签: c# asp.net-mvc asp.net-core-2.0 razor-pages


【解决方案1】:

当我在 POST 后从 Manage 操作返回时,我发现我搞砸了,因为我使用了:

if (await _schoolContext.SaveChangesAsync() == 0)
   return RedirectToAction("Index", "Admin");
return View(courseViewModel);

这让我再次浏览 courseViewModel,而不是被重定向到我需要的页面。 所以解决方法就是:

if (await _schoolContext.SaveChangesAsync() == 0)
                return View(courseViewModel);
return RedirectToAction("Index", "Admin");

【讨论】:

  • 您仍然可以获得该异常,因为当您执行 return View(courseViewModel); - Model.Teachers 的值是 null(您没有像在 GET 方法中那样重新填充它)。
  • 是的,你是对的,谢谢你的评论。
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多