从嵌套对象到视图的绑定下拉列表不起作用(对象引用未设置到对象的实例)

问题描述 投票:0回答:1
// GET: NCR/CreateQualityRepresentative
        public async Task<IActionResult> CreateQualityRepresentative()
        {
            NCR genNCR = new NCR();
            NCRNumber createNCRNumber = new NCRNumber();

            ViewData["QualityRepresentative.ProblemID"] = new SelectList(_context.Problems, "ID", "ProblemID");

            //Create next NCR number logic
            NCRNumber lastNCRNum = await _context.NCRNumbers
                .OrderByDescending(n => n.ID)
                .FirstOrDefaultAsync();

            createNCRNumber.Year = DateTime.Now.Date.Year;
            bool isNewYear = false;

            // Logic to decide if it is a new year and the conter should be set to 0
            if (lastNCRNum != null) {
                if (lastNCRNum.Year != DateTime.Now.Date.Year)
                {
                    isNewYear = true;
                    {
                        genNCR.NCRNum = createNCRNumber.GenerateNCRNumber(isNewYear);

                        _context.NCRNumbers.Add(createNCRNumber);
                        return View("Create", genNCR);
                    }
                }
                genNCR.NCRNum = createNCRNumber.GenerateNCRNumber(isNewYear);

                

                _context.NCRNumbers.Add(createNCRNumber);
                await _context.SaveChangesAsync();
                return View("Create", genNCR);
            }

            genNCR.NCRNum = createNCRNumber.GenerateNCRNumber(isNewYear);

            _context.NCRNumbers.Add(createNCRNumber);
            await _context.SaveChangesAsync();
            return View("Create", genNCR);

        }```

Code to my controller GET method


```lang-c#
using System.ComponentModel.DataAnnotations;

namespace Haver.Models
{
    public class Problem
    {
        public int ID { get; set; }

        [Display(Name = "Problem")]
        [Required(ErrorMessage = "Brief problem description is required.")]
        [StringLength(255, ErrorMessage = "Problem Description is limited to 255 characters.")]
        public string ProblemDescription { get; set; }

        public ICollection<QualityRepresentative> QualityRepresentatives { get; set; } = new HashSet<QualityRepresentative>();
    }
}

我的问题模型的代码


        // Foreign Key references
        [Required(ErrorMessage = "You must select a Problem.")]
        [Display(Name = "Problem ID")]
        public int ProblemID { get; set; }
        public Problem Problem { get; set; }

我的 QualityRepresentative 代码的一小部分显示了前键


using Haver.Models;
using System.ComponentModel.DataAnnotations;

namespace Haver.ViewModels
{
    public class NCR
    {
        public int ID { get; set; }

        [Required(ErrorMessage = "NCR number is required")]
        [Display(Name = "NCR number")]
        public string NCRNum { get; set; }

        [Display(Name = "Is engineering required?")]
        public bool IsEngineerRequired { get; set; }
        public string Status { get; set; }

        //Hard Coded role for testing purposes ONLY
        public string UserRole = "Quality Representative";

        public QualityRepresentative QualityRepresentative { get; set; }
        public Engineering Engineering { get; set; }
        public Purchasing Purchasing { get; set; }
        public Procurement Procurement { get; set; }
        public Reinspection Reinspection { get; set; }

        public int QualityRepresentativeID { get; set; }
        public int? EngineeringID { get; set; }
        public int? PurchasingID { get; set; }
        public int? ProcurementID { get; set; }
        public int? ReinspectionID { get; set; }

        public int? PrevNCRID { get; set; }
    }
}

这是我的 ncr 模型的代码

<select asp-for="QualityRepresentative.ProblemID" class="form-control" asp-items="ViewBag.ProblemID"></select>

我的视图代码的小提取,显示了选择的结构

所以基本上我想要的是将我的“问题”项目绑定到我视图中的下拉列表中。

我的模型结构是这样的:NCR --> QualityRepresentative --> Problem

我已经尝试了多种解决方案,但总是收到与“未设置对象引用”相关的错误。仅出于测试目的,我尝试将 QualityRepresentativeID 项目绑定到我的视图并且它有效,但如果我尝试使用 ProblemID 项目执行此操作,则它不起作用。

c# asp.net-mvc binding nested-object
1个回答
0
投票

<select asp-for="QualityRepresentative.ProblemID" class="form-control" asp-items="ViewBag.ProblemID"></select>

根据您的asp-items="ViewBag.ProblemID", 尝试改变:

ViewData["QualityRepresentative.ProblemID"] = new SelectList(_context.Problems, "ID", "ProblemID");

进入:

ViewBag.ProblemID = new SelectList(_context.Problems, "ID", "ProblemID");
© www.soinside.com 2019 - 2024. All rights reserved.