c# - 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">×</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());
}
解决方案
当 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);
}
推荐阅读
- git - 如何将元数据信息添加到 git 提交
- c# - 如何在 C# 中查找哪个 TcpClient 发送了消息
- docker - Docker 文件夹创建和 Kubernetes Volume
- excel - 在不同模块 VBA 中使用的变量
- c - 提供所需输出然后异常终止的函数
- mongodb - Mongodb 与 docker-compose - 创建用户
- c++ - 如何使用c ++中的共享指针通过istream传递本地streambuf
- angular - 使用依赖注入将函数从一个组件传递到另一个组件
- spring-security - 如何即时刷新反应式 Spring Security 应用程序
- javascript - 在 Reactjs 中使用 CSSTransition 和 Group Transition 时没有动画