C# MVC Ajax Form Modal DropDownList Validation Error

Last Reply 13 days ago By dharmendr

Posted 14 days 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 	VIEW
@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());
        }

 

You are viewing reply posted by: dharmendr 14 days ago.
Posted 14 days 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.