首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET核心MVC视图模型中的零参考误差

ASP.NET核心MVC视图模型中的零参考误差
EN

Stack Overflow用户
提问于 2022-03-29 01:57:42
回答 1查看 1.1K关注 0票数 0

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

VS2022中的错误是

Microsoft.AspNetCore.Mvc.Razor.RazorPage.Model.get返回

为空。

视图模型是

代码语言:javascript
复制
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; }


    }
}

视图段是

代码语言:javascript
复制
    <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部分获得一个空引用异常,并且我不知道造成这种情况的原因是什么。

控制器得到的动作是

代码语言:javascript
复制
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);
        }

员额行动是:

代码语言:javascript
复制
        [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;
            }
        }

你好,达伦

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-29 07:22:08

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

代码语言:javascript
复制
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,这是一个接口。此规则也适用于抽象类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71655616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档