C#MVC Ajax表单模式下拉列表验证错误

C#MVC Ajax表单模式下拉列表验证错误,c#,ajax,asp.net-mvc,C#,Ajax,Asp.net Mvc,我在我的模式中使用了Dropdownlist,我让它与文本框完美结合。我尝试将模型更改为多个不同的属性(String、Int、SelectListItem)。我觉得我必须非常接近让这个工作。我想我的验证消息出现时,即时通讯使用DropDownList以及。假设出现验证消息时,我会收到错误消息“具有键“PartVM.identerdby”的ViewData项的类型为“System.Int32”,但必须是“IEnumerable”类型。这是我的视图、模型和操作 public class Update

我在我的模式中使用了Dropdownlist,我让它与文本框完美结合。我尝试将模型更改为多个不同的属性(String、Int、SelectListItem)。我觉得我必须非常接近让这个工作。我想我的验证消息出现时,即时通讯使用DropDownList以及。假设出现验证消息时,我会收到错误消息“具有键“PartVM.identerdby”的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());
        }
public类UpdatePartViewModel
{
公共int PartID{get;set;}
[必需]
[显示(名称=“零件号”)]
公共字符串零件号{get;set;}
//[必需]
[显示(Name=“输入人”)]
{get;set;}输入的公共字符串
公共SelectListItem由{get;set;}输入
公共IEnumerable EnteredByOptions{get;set;}
public int identiredby{get;set;}
[显示(Name=“输入日期”)]
public DateTime DateEntered{get;set;}
[显示(Name=“机器类型”)]
公共列表MachineTypes{get;set;}
//公共字符串MachineTypeString{get;set;}
}
公共类FindPartModel
{
[显示(Name=“输入人”)]
公共字符串PNEnteredBy{get;set;}
公共IEnumerable pEnteredByOptions{get;set;}
public FindPartNumberListAttribute[]信息{get;set;}
公共列表报告列表{get;set;}
公共UpdatePartViewModel PartVM{get;set;}
}
//PNControls.cshtml视图
@型号Messer\u零件号.Models.FindPartModel
@{HtmlHelper.UnobtrusiveJavaScriptEnabled=true;}
@Html.AntiForgeryToken()
@Html.HiddenFor(x=>x.PartVM.PartID)
@Html.HiddenFor(x=>x.PartVM.PartGroup)
@LabelFor(x=>x.PartVM.PartNumber,htmlAttributes:new{@class=“control label col-3”})
@TextBoxFor(x=>x.PartVM.PartNumber,新的{@class=“form control”,@readonly=“readonly”})
@Html.ValidationMessageFor(x=>x.PartVM.PartNumber,“,新的{@class=“text danger”})
@LabelFor(x=>x.PartVM.EnteredBy,htmlAttributes:new{@class=“control label col-3”})
@*@TextBoxFor(x=>x.PartVM.EnteredBy,new{@class=“form control”})*@
@*@Html.DropDownListFor(x=>x.PartVM.SLIenteredBy,Model.PNEnteredByOptions作为IEnumerable,“选择用户”,新建{@class=“form control”})*@
@*@DropDownList(“DDLenteredBy”,Model.PNEnteredByOptions作为IEnumerable,新的{@class=“form control”})*@
@Html.DropDownListFor(x=>x.PartVM.IDenteredBy,Model.PNEnteredByOptions作为IEnumerable,“选择用户”,新建{@class=“form control”})
@*@Html.ValidationMessageFor(x=>x.PartVM.EnteredBy,“,新的{@class=“text danger”})*@
@*@Html.ValidationMessageFor(x=>x.PartVM.SLIenteredBy,“,新的{@class=“text danger”})*@
@Html.ValidationMessageFor(x=>x.PartVM.identerdby,“,新的{@class=“text danger”})
@使用(Ajax.BeginForm(“PartNumberUpdate”,“Parts”,new AjaxOptions(){HttpMethod=“POST”,UpdateTargetId=“PartNumControls”,OnSuccess=“ajaxPartUpdate”}))
{
零件号详细信息
&时代;
@Html.Partial(“PNControls”)
接近
}
[HttpPost]
[ValidateAntiForgeryToken]
[手机错误]
公共行动结果零件号更新(FindPartModel模型)
{
if(ModelState.IsValid)
{
var partNumber=context.PartNumbers.Where(x=>x.PartNumber1==model.PartVM.partNumber).FirstOrDefault();
//使用新型号信息更新零件数据。
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).选择(x=>x.ID).FirstOrDefault();
//partNumber.EnteredBy=enteredByID;}
/*testvar2=testVar1!=null?testVar1:testvar2;| | testvar2=testVar1??testvar2*/
partNumber.EnteredBy=model.PartVM.identiredby;
partNumber.DateEntered=model.PartVM.DateEntered;
///更新零件号记录
context.Entry(partNumber).State=EntityState.Modified;
SaveChanges();
ViewBag.ValidMessage=“零件号记录已更新”;
字符串returnStr=“刷新”;
ModelState.Clear();
returnjson(returnStr);
}
TempData[“ErrorState”]=“x”;
返回PartialView(“PNControls”,模型);
}
公共行动结果控制()
{
返回视图(新的FindPartModel());
}

当ModelState无效时,我需要重新填充我的Dropdownlists。 现在,我用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);
}