'In ASP.Net MVC Database first , when i try to create a dropdown list which will show values from another table , it gives System.ArgumentNullException

I want to create a dropdown list which shows all the payPeriods which are stored in a seperate table PayPeriod.

<div class="form-group">
            @Html.LabelFor(model=>model.TimePeriod.PayPeriodId)
            @Html.DropDownListFor(model=>model.TimePeriod.PayPeriodId,new SelectList(Model.PayPeriods, "PayPeriodId","PayPeriodName"),"Select Payperiod", new {@class="form-control"})

        </div>

Controller:-

public ActionResult Create(TimePeriodViewModel timePeriodVM)
        {
            //First get the payperiods from database
            var payperiods = db.PayPeriods.ToList();
             var payperiod = new PayPeriod
             {
                 PayPeriodId = timePeriodVM.PayPeriod.PayPeriodId
             };
            var timeperiod = new TimePeriod
            {
              
              // TimePeriodID=timePeriodVM.TimePeriod.TimePeriodID,
                PersonnelID = timePeriodVM.TimePeriod.PersonnelID,
                StartDate = timePeriodVM.TimePeriod.StartDate,
                EndDate = timePeriodVM.TimePeriod.EndDate,
                PayPeriod=timePeriodVM.TimePeriod.PayPeriod,
                TotalAvgHours = timePeriodVM.TimePeriod.TotalAvgHours,
                TotalTimeSheetHours = timePeriodVM.TimePeriod.TotalTimeSheetHours,
                TotalOvertime = timePeriodVM.TimePeriod.TotalOvertime

                
            };
            var dailyregister = new DailyRegister
            {
                //TimePeriodID=timePeriodVM.TimePeriod.TimePeriodID,
                Day = timePeriodVM.DailyRegister.Day,
                Date = timePeriodVM.DailyRegister.Date,
                PaidHours = timePeriodVM.DailyRegister.PaidHours,
                AgreedHours= timePeriodVM.DailyRegister.AgreedHours,
                DetailsOfWorkTimeSheet = timePeriodVM.DailyRegister.DetailsOfWorkTimeSheet,
                OverTime = timePeriodVM.DailyRegister.OverTime,
};
           
            if (ModelState.IsValid)
            {
               
                db.TimePeriods.Add(timeperiod);
                db.DailyRegisters.Add(dailyregister);
                db.PayPeriods.Add(payperiod);

                
                db.SaveChanges();
                return RedirectToAction("Index");
            }

TimePeriodViewModel:-

public class TimePeriodViewModel
    {
        public IEnumerable<Personnel> Personnels { get; set; }
       //public Personnel Personnel { get; set; }
       public int PersonnelID { get; set; }
       
        public IEnumerable<DailyRegister> DailyRegisters { get; set; }
        public DailyRegister DailyRegister { get; set; }
        public TimePeriod TimePeriod { get; set; }
        public IEnumerable<PayPeriod> PayPeriods { get; set; }
        public PayPeriod PayPeriod { get; set; }
    }

Also, one thing i noticed is when i created foriegn key relationship between TimePeriod and PayPeriod-> it shows in edmx PayPeriod1 in navigation properties of Timeperiod table. TimeSheet.edmx



Solution 1:[1]

Update the CREATE GET method which will actually pull the dropdown list values from database.

public ActionResult Create()
{
    ViewBag.PersonnelID = new SelectList(db.Personnels, "PersonnelID", "FirstName");
        var payperiods = db.PayPeriods.ToList();
        var personnel = db.Personnels.ToList();
    //var dailyRegister = db.DailyRegisters;
    var model = new TimePeriodViewModel
    {
        Personnels = personnel,
        PayPeriods=payperiods
       // DailyRegister= DailyRegister
    };
    return View(model);
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1