C# MVC Ajax Ошибка проверки формы DropDownList формы - PullRequest
0 голосов
/ 13 января 2020

Я использую Dropdownlist в моем модале, он отлично работает с текстовыми полями. Я пытался изменить мою модель для нескольких различных свойств (String, Int, SelectListItem). Я чувствую, что должен быть очень близко к тому, чтобы заставить это работать. Я хотел бы, чтобы мое подтверждающее сообщение появлялось при использовании Dropdownlists. Когда должно появиться сообщение проверки, я получаю сообщение об ошибке «Элемент ViewData, имеющий ключ« PartVM.IDenteredBy », имеет тип« 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());
        }

1 Ответ

0 голосов
/ 13 января 2020

Мне нужно было заполнить мои выпадающие списки, когда 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...