数据注释validation在ASP.NET MVC 3中不起作用

我在部分视图中有一个表单,该表单在选项卡控件上的选项卡内呈现,如下所示:

@model USARAFSyncMVC.Areas.Event.Models.EventFullScaffoldModel @using (Ajax.BeginForm("SaveMainEventDetails", "Event", new { area = "Event" }, new AjaxOptions { UpdateTargetId = "FormWrapper", OnComplete = "SetSuccessLabel", InsertionMode = InsertionMode.Replace }, new { method = "post" })) { @Html.Hidden("eventType", "1", new { id = "eventType" }) 

Title @Html.TextBoxFor(model => model.Title, new { style = "width:300px" }) @Html.ValidationMessageFor(model => model.Title)
OPR @Html.EditorFor(model => model.OPRID)
Organization @Html.EditorFor(model => model.DomainID)
POC @Html.EditorFor(model => model.POC)
Location @Html.EditorFor(model => model.LocationID)
Dates
@Html.LabelFor(m => m.StartDate) @Html.LabelFor(m => m.EndDate)
@Html.EditorFor(m => m.StartDate) @Html.EditorFor(m => m.EndDate)
Deploy ReDeploy
@Html.EditorFor(m => m.EstimatedDeployDate) @Html.EditorFor(m => m.EstimatedReDeployDate)
OSRs @(Html.Telerik() .PanelBar() .Name("PanelBar") .HtmlAttributes(new { style = "width:300px;" }) .Items(o => o.Add().Text("Click").Content(@ @Html.CheckBoxList("OprList", x => x.OprList, x => x.OPRID, x => x.AltTitle, x => x.EventOSRs, Position.Vertical)).Expanded(false)))
Purpose @Html.TextBoxFor(model => model.Why, new { style = "width: 400px; height:200px" })
Background @Html.TextBoxFor(model => model.What, new { style = "width: 400px; height:200px" })
Viewable @Html.CheckBoxFor(model => model.Viewable)
}

这是控制器:

  [HttpPost] public ActionResult SaveMainEventDetails(EventFullScaffoldModel model, string[] OprList, string eventType, string cbLoc, string cbOpr, string cbOrg) { if (OprList != null) { model.EventOSRs = miscRepository.GetOprsList().ToModel().Where(o => OprList.Contains(o.OPRID.ToString())).ToList(); } model.Type = int.Parse(eventType); model.LocationID = cbLoc; model.OPRID = int.Parse(cbOpr); model.DomainID = int.Parse(cbOrg); eventRepository.Insert(model.ToDto()); return View(); } 

这是模型:

  public partial class EventFullScaffoldModel { public Int32 EventID { get; set; } [Required(ErrorMessage = "Required!")] public String Title { get; set; } [Required(ErrorMessage = "Required!")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")] public DateTime StartDate { get; set; } [Required(ErrorMessage = "Required!")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")] public DateTime EndDate { get; set; } [Required(ErrorMessage = "Required!")] public String What { get; set; } [Required(ErrorMessage = "Required!")] public String Why { get; set; } public Nullable Modified { get; set; } public String ModifiedBy { get; set; } public Nullable Created { get; set; } public String CreatedBy { get; set; } [UIHint("ActiveDirectoryLoadOnDemand"), Required] public String POC { get; set; } [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:MM-dd-yyyy}")] public Nullable EstimatedDeployDate { get; set; } [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:MM-dd-yyyy}")] public Nullable EstimatedReDeployDate { get; set; } public Nullable TSCMISID { get; set; } public Nullable ReviewStatus { get; set; } public int? Type { get; set; } public String InactivityReason { get; set; } public Boolean Viewable { get; set; } public string OPRAltTitle { get; set; } [UIHint("OprDropDown"), Required] public int OPRID { get; set; } [UIHint("OrgDropDown"), Required] public int DomainID { get; set; } [UIHint("LocationsLoadOnDemand"), Required] public string LocationID { get; set; } public string LocationTitle { get; set; } public IList EventOSRs { get; set; } public IList EventTargetEffects { get; set; } public IList EventAssociations { get; set; } public IList EventObjectives { get; set; } public IList EventTSOs { get; set; } public IList EventTasks { get; set; } public IList EventPaxBreakDowns { get; set; } public IList EventFundings { get; set; } public IList EventExecutingUnits { get; set; } public IList OprList { get; set; } public IList ObjectiveList { get; set; } public IList StrategicList { get; set; } public IList OrgsList { get; set; } } 

模型永远不会得到validation,直接在控制器上执行事务。 为什么这不起作用?

我建议首先检查是否已按正确的顺序包含必要的javascript文件以进行不显眼的validation,这将使validation在客户端成功完成。

关于服务器端validation,其他告诉基本上你必须通过显式检查ModelState.IsValid将模型保存到数据库。 由于您正在进行AJAX调用,我建议您将模型状态错误作为JSON返回。

因此,在OnFailure方法中,您可以解析JSON并将错误显示为div中的摘要。

基本上你可以遵循这种模式。

 [HttpPost] public JsonResult SaveMainEventDetails(..) { if(ModelState.IsValid) { .. save to database return Json(new{ success = true }); } var errorDict = ModelState.. return Json(new { success = false, errors = errorDict }); } 

您需要在操作中显式检查是否为ModelState.IsValid ,如果不是则返回编辑视图。
如果显示无效模型的编辑视图,MVC将通过Validate帮助程序自动显示错误消息。

这应该说明一下: 在NerdDinner的ASP.NET MVC中,ModelState.IsValid有效吗?

基本上,您必须使用ModelState.IsValid触发模型validation

添加@{ Html.EnableClientValidation(); } 在视图中

并参考thsi链接以获取更多详细信息如何:使用DataAnnotations属性validation模型数据

好的问题是Telerik Script Registrar没有引用正确的JQuery。 现在它正在运作。 我直接引用了JQuery库,还有validation脚本。 在Telerik脚本注册器上,它已经是默认组的一部分,正如我正在做的那样重新引用它们,导致它出于某种原因而吓坏了。 仅添加对原始默认组不属于的脚本的引用。 有关这方面的更多信息,需要阅读此MVC扩展的在线文档。