首页 > 解决方案 > C# MVC Ajax 表单模态下拉列表验证错误

问题描述

我在我的模式中使用了一个下拉列表,我让它与文本框完美配合。我尝试将我的模型更改为多个不同的属性(字符串、整数、SelectListItem)。我觉得我必须非常接近让它发挥作用。我也希望在我使用下拉列表时出现我的验证消息。假设出现验证消息时,我收到错误消息“具有键“PartVM.IDenteredBy”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable”类型。这是我的观点、模型和行动。

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

标签: c#ajaxasp.net-mvc

解决方案


当 ModelState 无效时,我需要重新填充我的下拉列表。现在我使用 ajax 的验证完全符合预期。我在 PartNumberUpdate 操作结束时需要这个。

    }
    /// Populate DropDownLists in Modal to UPDATE fields
    var fetcher = new DataFetcher();
    model.PNEnteredByOptions = fetcher.EnteredByInfo();
    //ViewBag.DDLenteredby = fetcher.EnteredByInfo();
    model.PNMachineTypeOptions = fetcher.machineTypeInfo();
    model.PNSoftwareTypeOptions = fetcher.softwareTypeInfo();
    model.PNManufacturerOptions = fetcher.manufactuerInfo();
    model.PNUsageOptions = fetcher.usageInfo();
    model.PNUnitsOptions = fetcher.unitsInfo();

    TempData["ErrorState"] = "x";
    return PartialView("PNControls", model);
}

推荐阅读