ASP.NET 核心 MVC 视图模型中出现空引用错误

Getting Null Reference error in ASP.NET Core MVC view model

我正在尝试显示项目状态的下拉列表,该列表还填充了数据库中的当前值。问题是我在 UpdateProject 操作(单击按钮时)上不断收到空引用异常。

VS2022中的错误是

Microsoft.AspNetCore.Mvc.Razor.RazorPage.Model.get returned null.

视图模型是

using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
using WebServices.DomainModels.Projects;

namespace WebServices.ViewModels.Projects
{
    public class vmUpdateProject
    {
        public Project Projects { get; set; }
        public IEnumerable<SelectListItem> Priorities { get; set; }

        public string SelectedPriority { get; set; }
        public IEnumerable<SelectListItem> Statuses { get; set; }

        public string SelectedStatus { get; set; }

        public IEnumerable<SelectListItem> Urgency { get; set; }
        public string SelectedUrgency { get; set; }


    }
}

并且视图段是


    <form method="post" asp-action="UpdateProject" class="container-fluid ps-5">
        <input asp-for="Projects.ProjectId" />
        <div class="container-fluid p-3">
            <div class="row">
                <div class="col-lg-8">
                    <h1 class="text-primary">Update Project Details</h1>
                </div>
                <div class="col-lg-2">
                    <input type="submit" class="btn btn-info w-100" value="Update Project" />
                    @*<a asp-action="UpdateProject" class="btn btn-info w-100">Update Project</a>*@
                </div>
                <div class="col-lg-2">
                    <a asp-action="Dashboard" asp-controller="Project" class="btn btn-danger w-100">Project Dashboard</a>
                    <p class="small">Returns you to the dashboard. You will lose any changes</p>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-lg-12 float-right">
                <div class="col-lg-6">
                    Project Status
                </div>
                <div class="col-lg-6">
                    @Html.DropDownListFor(m => Model.Projects.ProjectStatus, new SelectList(Model.Statuses,"Value","Text",Model.Projects.ProjectStatus))
                </div>
            </div>
        </div>
    </form>

视图很好地显示和填充了所有数据。 DropDownList 填充了列表项,但是当我单击“更新项目”时,它在 @Html.DropDownListFor 部分的行中出现空引用异常,我不知道我缺少什么导致了这个。

控制器 GET 动作是

public IActionResult UpdateProject(int? id)
        {
            if (id == null || id == 0)
            {
                return NotFound();
            }
            var vmProjectDetails = new vmUpdateProject();
            vmProjectDetails.Projects = ReturnProjectDetails(id, dbWebServicesString);
            vmProjectDetails.Priorities = GetSelectListItems("ProjectPriority", dbWebServicesString);
            vmProjectDetails.Statuses = GetSelectListItems("ProjectStatus", dbWebServicesString);
            vmProjectDetails.Urgency = GetSelectListItems("ProjectUrgency", dbWebServicesString);
            //var obj = _db.Projects.Find(id);
            //if(obj == null)
            //{
            //    return NotFound();
            //}
            return View(vmProjectDetails);
        }

post 操作是:


        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult UpdateProject(vmUpdateProject obj)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _db.Projects.Update(obj.Projects);
                    _db.SaveChanges();
                    return RedirectToAction("Dashboard", "Project");

                }
                else
                {
                    //TODO: Put in error handling for ModelState.IsValid
                    return View();
                }
            }
            catch (SqlTypeException ex)
            {
                return null;
            }
        }

此致, 达伦

您首先需要将 SelectList 的类型从 IEnumerable<SelectListItem> 更改为 List<SelectListItem>,您还需要在 [=15= 中实例化一个新的 List<SelectListItem> ] 构造函数。将您的 Model 更改为:

public class vmUpdateProject
{

    public vmUpdateProject()
    {
        Priorities = new List<SelectListItem>();
        Statuses = new List<SelectListItem>();
        Urgency = new List<SelectListItem>();
    }
    
    public Project Projects { get; set; }
    public List<SelectListItem> Priorities { get; set; }

    public string SelectedPriority { get; set; }
    public List<SelectListItem> Statuses { get; set; }

    public string SelectedStatus { get; set; }

    public List<SelectListItem> Urgency { get; set; }
    public string SelectedUrgency { get; set; }

}

您无法实例化接口的实例,并且您已将 SelectListItem 声明为 IEnumerable,这是一个接口。此规则也适用于摘要 类.