I'm trying to return a list of LeaveTypes from a model using DropDownListFor. I have found a few topics on this issue, so it seems to be common, and I presume the list needs to be repopulated, but I can't find a way that works (or a way that I understand against the other examples).
I always get the null error regardless of what I do. I'm thinking that maybe actually it is not returning any leavetypes items in the first place, but I'm not understanding the way dropdownlist works with a model.
Is there a different issue causing the null that I can't see right now? view :
` <div class="form-group">
<label asp-for="LeaveTypeId" class="control-label"></label>@Html.DropDownListFor(q => q.LeaveTypeId, new SelectList(Model.LeaveTypes,
"Value", "Text"), "Select Leave Type", new { @class = "form-control" })<span asp-validation-for="LeaveTypeId" class="text-danger"></span>
</div>`
I define the list in a class:
public class CreateLeaveRequestVM
{
[Display(Name = "Start Date")]
[Required]
public string StartDate { get; set; }
[Display(Name = "End Date")]
[Required]
public string EndDate { get; set; }
public IEnumerable<SelectListItem> LeaveTypes { get; set; } // the value here is null why ?
[Display(Name ="Leave Type")]
public int LeaveTypeId { get; set; }
[Display(Name = "Employee Comments")]
[MaxLength(300)]
public string RequestComments { get; set; }
}
// GET: LeaveRequestController/Create
public ActionResult Create()
{
var leaveTypes = _leaveTypeRepo.FindAll();
var leaveTypeItems = leaveTypes.Select(q => new SelectListItem {
Text = q.Name,
Value = q.Id.ToString()
});
var model = new CreateLeaveRequestVM
{
LeaveTypes = leaveTypeItems
};
return View(model);
}
// POST: LeaveRequestController/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateLeaveRequestVM model)
{
try
{
var startDate = Convert.ToDateTime(model.StartDate);
var endDate = Convert.ToDateTime(model.EndDate);
var leaveTypes = _leaveTypeRepo.FindAll();
var leaveTypeItems = leaveTypes.Select(q => new SelectListItem
{
Text = q.Name,
Value = q.Id.ToString()
});
model.LeaveTypes = leaveTypeItems;
if (!ModelState.IsValid)
{
return View(model);
}
if (DateTime.Compare(startDate, endDate) > 1)
{
ModelState.AddModelError("", "Start date cannot be further in the future than the end date");
return View(model);
}
var employee = _userManager.GetUserAsync(User).Result;
var allocation = _leaveAllocRepo.GetLeaveAllocationsByEmployeeAndType(employee.Id, model.LeaveTypeId);
int daysRequested = (int)(endDate - startDate).TotalDays;
if (daysRequested > allocation.NumberOfDays)
{
ModelState.AddModelError("", "You do not have sufficient days for this request!");
return View(model);
}
var leaveRequestModel = new LeaveRequestVM
{
RequestingEmployeeId = employee.Id,
StartDate = startDate,
EndDate = endDate,
Approved = null,
DateRequested = DateTime.Now,
DateActioned = DateTime.Now,
LeaveTypeId = model.LeaveTypeId,
RequestComments = model.RequestComments
};
var leaveRequest = _mapper.Map<LeaveRequest>(leaveRequestModel);
var isSuccess = _leaveRequestRepo.Create(leaveRequest);
if (!isSuccess)
{
ModelState.AddModelError("", "Something went wrong with submitting your record");
return View(model);
}
return RedirectToAction("MyLeave");
}
catch (Exception)
{
ModelState.AddModelError("", "Something went wrong");
return View(model);
}
}