我正在尝试显示项目状态的下拉列表,该下拉列表还填充了数据库中的当前值。问题是,我一直在UpdateProject操作上获得一个空引用异常(当单击按钮时)。
VS2022中的错误是
Microsoft.AspNetCore.Mvc.Razor.RazorPage.Model.get返回
为空。
视图模型是
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中填充了列表项,但是当我单击Update时,它会在行@Html.DropDownListFor部分获得一个空引用异常,并且我不知道造成这种情况的原因是什么。
控制器得到的动作是
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);
}员额行动是:
[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;
}
}你好,达伦
发布于 2022-03-29 07:22:08
首先,需要将SelectList的类型从IEnumerable<SelectListItem>更改为List<SelectListItem>,还需要在Model构造函数中实例化一个新的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,这是一个接口。此规则也适用于抽象类。
https://stackoverflow.com/questions/71655616
复制相似问题