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
,这是一个接口。此规则也适用于摘要 类.
我正在尝试显示项目状态的下拉列表,该列表还填充了数据库中的当前值。问题是我在 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
,这是一个接口。此规则也适用于摘要 类.