ASP.Net MVC Error: The ViewData item that has the key is of type System.Int32 but must be of type IEnumerable<SelectListItem>

Last Reply one year ago By dharmendr

Posted one year ago

Hello Everyone,

I am using a Dropdownlist in my modal I have it working perfectly with textboxes. I’ve tried changing my Model to multiple properties (String, Int, SelectListItem). I feel I must be extremely close to getting this to work.

I would like my validation message to appear when im using Dropdownlists as well. When the validation message is suppose to appear I get the error message ‘The ViewData item that has the key 'PartVM.IDenteredBy' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.’ Here is my View, Model, and Action. 

    public class UpdatePartViewModel
    {
        public int PartID { get; set; }
        [Required]
        [Display(Name = "Part Number")]
        public string PartNumber { get; set; }
        //[Required]
        [Display(Name = "Entered By")]
        public string EnteredBy { get; set; }
        public SelectListItem SLIenteredBy { get; set; }
        public IEnumerable<SelectListItem> EnteredByOptions { get; set; }
        public int IDenteredBy { get; set; }
        [Display(Name = "Date Entered")]
        public DateTime DateEntered { get; set; }
        [Display(Name = "Machine Types")]
        public List<int> MachineTypes { get; set; }
        //public string MachineTypesString { get; set; }
    }
    public class FindPartModel
    {
        [Display(Name = "Entered By")]
        public string PNEnteredBy { get; set; }
        public IEnumerable<SelectListItem> PNEnteredByOptions { get; set; }
        public findPartNumberListAttributes[] info { get; set; }
        public List<findPartNumberListAttributes> reportList { get; set; }
        public UpdatePartViewModel PartVM { get; set; }
    }

//PNControls.cshtml

@model Messer_PartNumbers.Models.FindPartModel

@{     HtmlHelper.UnobtrusiveJavaScriptEnabled = true; }
@Html.AntiForgeryToken()

@Html.HiddenFor(x => x.PartVM.PartID)
@Html.HiddenFor(x => x.PartVM.PartGroup)
<div class="form-group">
    @Html.LabelFor(x =>x.PartVM.PartNumber, htmlAttributes: new { @class="control-label col-3" })
    <div class="col-9">
        @Html.TextBoxFor(x => x.PartVM.PartNumber, new { @class="form-control", @readonly="readonly" })
        @Html.ValidationMessageFor(x => x.PartVM.PartNumber, "", new { @class="text-danger" })
    </div>
</div>
<div class="form-group">
    @Html.LabelFor(x => x.PartVM.EnteredBy, htmlAttributes: new { @class = "control-label col-3" })
    <div class="col-9">
        @*@Html.TextBoxFor(x => x.PartVM.EnteredBy, new { @class="form-control" })*@
        @*@Html.DropDownListFor(x => x.PartVM.SLIenteredBy, Model.PNEnteredByOptions as IEnumerable<SelectListItem>, "Select User", new { @class = "form-control" })*@
        @*@Html.DropDownList("DDLenteredBy", Model.PNEnteredByOptions as IEnumerable<SelectListItem>, new { @class="form-control" })*@
        @Html.DropDownListFor(x => x.PartVM.IDenteredBy, Model.PNEnteredByOptions as IEnumerable<SelectListItem>, "Select User", new { @class = "form-control" })
        @*@Html.ValidationMessageFor(x => x.PartVM.EnteredBy, "", new { @class = "text-danger" })*@
        @*@Html.ValidationMessageFor(x => x.PartVM.SLIenteredBy, "", new { @class = "text-danger" })*@
        @Html.ValidationMessageFor(x => x.PartVM.IDenteredBy, "", new { @class = "text-danger" })
    </div>
</div>
@using (Ajax.BeginForm("PartNumberUpdate", "Parts", new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "PartNumControls", OnSuccess = "ajaxPartUpdate" }))
{
    <div class="modal" id="modalPNUpdate" tabindex="-1" role="dialog" aria-labelledby="lblPNUpdate" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h3 class="modal-title">Part Number Details</h3>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body" id="PartNumControls">
                    @Html.Partial("PNControls")
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
                    <input type="submit" class="btn btn-primary" value="Save" />
                </div>
            </div>
        </div>
    </div>
}

 

        [HttpPost]
        [ValidateAntiForgeryToken]
        [HandleError]
        public ActionResult PartNumberUpdate(FindPartModel model)
        {
            if (ModelState.IsValid)
            {
                var partNumber = context.PartNumbers.Where(x => x.PartNumber1 == model.PartVM.PartNumber).FirstOrDefault();
                // Updating the Parts data with the new Models Information.
                partNumber.PartNumber1 = model.PartVM.PartNumber;
                partNumber.PartGroup = model.PartVM.PartGroup != null ? model.PartVM.PartGroup : partNumber.PartGroup;
                partNumber.Last4Number = model.PartVM.Last4Numbers;
                //var str = Request.Form["DDLenteredBy"];
                //if(model.PartVM.EnteredBy != null)
                //{ var enteredByID = context.Employees.Where(e => e.Name == model.PartVM.EnteredBy).Select(x => x.ID).FirstOrDefault();
                //    partNumber.EnteredBy = enteredByID; }
                /* testvar2 = testVar1 != null ? testvar1 : testvar2;  ||  testVar2 = testVar1 ?? testVar2  */
                partNumber.EnteredBy = model.PartVM.IDenteredBy;
                partNumber.DateEntered = model.PartVM.DateEntered;
                /// UPDATE PartNumber Record
                context.Entry(partNumber).State = EntityState.Modified;
                context.SaveChanges();
                ViewBag.ValidMessage = "PartNumber Record Updated";
                string returnStr = "refresh";
                ModelState.Clear();
                return Json(returnStr);
            }
            TempData["ErrorState"] = "x";
            return PartialView("PNControls", model);
        }

        public ActionResult PNControls()
        {
            return View(new FindPartModel());
        }

 

Posted one year ago

I will get back to you soon.


Posted one year ago

Hi bigbear,

The error means that the value of EnteredByOptions is null and as a result the DropDownListFor() method expects the parameter is of type IEnumerable<SelectListItem>.

The value of Model.EnteredByOptions in the POST method is null. You must first reassign the value of EnteredByOptions and then return the model.


Posted one year ago

Hi bigbear,

The error means that the value of PNEnteredByOptions is null and as a result the DropDownListFor() method expects the parameter is of type IEnumerable<SelectListItem>. The value of Model.PNEnteredByOptions in the POST method is null. You must first reassign the value of PNEnteredByOptions and then return the model.

Change with below code.

[HttpPost]
[ValidateAntiForgeryToken]
[HandleError]
public ActionResult PartNumberUpdate(FindPartModel model)
{
    if (ModelState.IsValid)
    {
        var partNumber = context.PartNumbers.Where(x => x.PartNumber1 == model.PartVM.PartNumber).FirstOrDefault();
        // Updating the Parts data with the new Models Information.
        partNumber.PartNumber1 = model.PartVM.PartNumber;
        partNumber.PartGroup = model.PartVM.PartGroup != null ? model.PartVM.PartGroup : partNumber.PartGroup;
        partNumber.Last4Number = model.PartVM.Last4Numbers;
        //var str = Request.Form["DDLenteredBy"];
        //if(model.PartVM.EnteredBy != null)
        //{ var enteredByID = context.Employees.Where(e => e.Name == model.PartVM.EnteredBy).Select(x => x.ID).FirstOrDefault();
        //    partNumber.EnteredBy = enteredByID; }
        /* testvar2 = testVar1 != null ? testvar1 : testvar2;  ||  testVar2 = testVar1 ?? testVar2  */
        partNumber.EnteredBy = model.PartVM.IDenteredBy;
        partNumber.DateEntered = model.PartVM.DateEntered;
        /// UPDATE PartNumber Record
        context.Entry(partNumber).State = EntityState.Modified;
        context.SaveChanges();
        ViewBag.ValidMessage = "PartNumber Record Updated";
        string returnStr = "refresh";
        ModelState.Clear();
        return Json(returnStr);
    }
    TempData["ErrorState"] = "x";
    // Reassign the PNEnteredByOptions.
    // Get SelectListItem as per your need.
    model.PNEnteredByOptions = new List<SelectListItem> { 
        new SelectListItem{Text="Option 1", Value="1"},
        new SelectListItem{Text="Option 2", Value="2"}};
    return PartialView("PNControls", model);
}