Binding dropdown list from a nested object to a view not working (object reference not set to an instance of an object)

32 Views Asked by At
// 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>();
    }
}

Code to my Problem model


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

Small part of my QualityRepresentative code showing the foreing key


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; }
    }
}

this is the code to my ncr model

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

Small extraction of my view code showing how the select is structured

So basicly what i wanted is to bind my "Problem" items into a dropdown list in my view.

My model structure is like this: NCR --> QualityRepresentative --> Problem

I already tried multiple solutions but I always get an error related to "object reference not set". Just for testing purposes i tried to bind the QualityRepresentativeID items to my view and it worked, but if I try to do it with the ProblemID items, it does not work.

1

There are 1 best solutions below

1
Qing Guo On

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

Acording to your asp-items="ViewBag.ProblemID", try to change :

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

into:

ViewBag.ProblemID = new SelectList(_context.Problems, "ID", "ProblemID");