C# 数据批注验证在ASP.NET MVC 3中不起作用

C# 数据批注验证在ASP.NET MVC 3中不起作用,c#,jquery,.net,asp.net-mvc,razor,C#,Jquery,.net,Asp.net Mvc,Razor,我在局部视图中有一个窗体,该窗体在选项卡控件的选项卡中呈现,如下所示: @model USARAFSyncMVC.Areas.Event.Models.EventFullScaffoldModel @using (Ajax.BeginForm("SaveMainEventDetails", "Event", new { area = "Event" }, new AjaxOptions { UpdateTargetId = "FormWrapper", OnComplete = "Se

我在局部视图中有一个窗体,该窗体在选项卡控件的选项卡中呈现,如下所示:

@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" })
    <div id="FormWrapper">
      <hr />
      <table border="0">
        <tr>
          <td>Title</td>
          <td>@Html.TextBoxFor(model => model.Title, new { style = "width:300px" })
            @Html.ValidationMessageFor(model => model.Title)</td>

        </tr>
        <tr>
          <td>OPR</td>
          <td> @Html.EditorFor(model => model.OPRID)</td>

        </tr>
        <tr>
          <td>Organization</td>
          <td> @Html.EditorFor(model => model.DomainID)</td>

        </tr>
        <tr>
          <td>POC</td>
          <td> @Html.EditorFor(model => model.POC)</td>

        </tr>
        <tr>
          <td>Location</td>

          <td>
            @Html.EditorFor(model => model.LocationID)
          </td>

        </tr>
        <tr>
          <td>Dates</td>
          <td>
            <table>
              <tr>
                <th>@Html.LabelFor(m => m.StartDate)</th>
                <th> @Html.LabelFor(m => m.EndDate)</th>
              </tr>
              <tr>
                <td> @Html.EditorFor(m => m.StartDate)</td>
                <td>@Html.EditorFor(m => m.EndDate)</td>
              </tr>

            </table>

            <table id="DeployRedeployDiv">
              <tr>
                <th>Deploy</th>
                <th>ReDeploy</th>
              </tr>
              <tr>
                <td> @Html.EditorFor(m => m.EstimatedDeployDate)</td>
                <td>@Html.EditorFor(m => m.EstimatedReDeployDate)</td>
              </tr>

            </table>

          </td>
        </tr>
        <tr>
          <td>OSRs</td>
          <td>
            @(Html.Telerik()
                  .PanelBar()
                  .Name("PanelBar")
                  .HtmlAttributes(new { style = "width:300px;" })
                  .Items(o => o.Add().Text("Click").Content(@<text> 

                @Html.CheckBoxList("OprList",
                    x => x.OprList,
                    x => x.OPRID,
                    x => x.AltTitle,
                    x => x.EventOSRs, Position.Vertical)</text>).Expanded(false)))
          </td>
        </tr>
        <tr>
          <td>Purpose</td>
          <td> @Html.TextBoxFor(model => model.Why, new { style = "width: 400px; height:200px" })</td>
        </tr>
        <tr>
          <td>Background</td>
          <td> @Html.TextBoxFor(model => model.What, new { style = "width: 400px; height:200px" })</td>
        </tr>
        <tr>
          <td>Viewable</td>
          <td> @Html.CheckBoxFor(model => model.Viewable)</td>
        </tr>

      </table>
      <div>
        <input class="t-button" type="submit" name="button" value="Save" />

      </div>

    </div>

}
模型如下:

   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<DateTime> Modified { get; set; }

        public String ModifiedBy { get; set; }

        public Nullable<DateTime> 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<DateTime> EstimatedDeployDate { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:MM-dd-yyyy}")]
        public Nullable<DateTime> EstimatedReDeployDate { get; set; }

        public Nullable<Int32> TSCMISID { get; set; }

        public Nullable<Int32> 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<OsrModel> EventOSRs { get; set; }

        public IList<TargetAndEffectModel> EventTargetEffects { get; set; }

        public IList<AssociationModel> EventAssociations { get; set; }

        public IList<EventObjectiveModel> EventObjectives { get; set; }

        public IList<StrategicObjectiveModel> EventTSOs { get; set; }

        public IList<TaskModel> EventTasks { get; set; }

        public IList<PaxModel> EventPaxBreakDowns { get; set; }

        public IList<FundingModel> EventFundings { get; set; }

        public IList<UnitModel> EventExecutingUnits { get; set; }

        public IList<OsrModel> OprList { get; set; }

        public IList<ObjectiveModel> ObjectiveList { get; set; }

        public IList<StrategicObjectiveModel> StrategicList { get; set; }

        public IList<OrgModel> OrgsList { get; set; }
    }
public分部类EventFullScaffoldModel
{
公共Int32事件ID{get;set;}
[必需(ErrorMessage=“必需!”)]
公共字符串标题{get;set;}
[必需(ErrorMessage=“必需!”)]
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:dd-MM-yyyy}”)]
公共日期时间起始日期{get;set;}
[必需(ErrorMessage=“必需!”)]
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:dd-MM-yyyy}”)]
公共日期时间结束日期{get;set;}
[必需(ErrorMessage=“必需!”)]
公共字符串What{get;set;}
[必需(ErrorMessage=“必需!”)]
公共字符串为什么{get;set;}
公共可空修改{get;set;}
公共字符串由{get;set;}修改
已创建公共可为null的{get;set;}
通过{get;set;}创建的公共字符串
[UIHint(“ActiveDirectoryLoadOnDemand”),必填]
公共字符串POC{get;set;}
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:MM dd yyyy}”)]
公共可为空的EstimatedDeployDate{get;set;}
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:MM dd yyyy}”)]
公共可为空的EstimateDeployDate{get;set;}
公共可空TSCMISID{get;set;}
公共可为空的ReviewStatus{get;set;}
公共int?类型{get;set;}
公共字符串InactivityReason{get;set;}
公共布尔可查看{get;set;}
公共字符串OPRAltTitle{get;set;}
[UIHint(“OprDropDown”),必填]
公共int-OPRID{get;set;}
[UIHint(“OrgDropDown”),必填]
公共int域ID{get;set;}
[UIHint(“位置SLOADONDEMAND”),必填]
公共字符串LocationID{get;set;}
公共字符串LocationTitle{get;set;}
公共IList EventOSRs{get;set;}
公共IList EventTargetEffects{get;set;}
公共IList事件关联{get;set;}
公共IList事件目标{get;set;}
公共IList EventTSOs{get;set;}
公共IList事件任务{get;set;}
公共IList EventPaxBreakDowns{get;set;}
公共IList事件基金{get;set;}
公共IList EventExecutingUnits{get;set;}
公共IList操作列表{get;set;}
公共IList对象列表{get;set;}
公共IList StrategicList{get;set;}
公共IList OrgsList{get;set;}
}

该模型从未得到验证,而是直接在控制器上的事务中运行。为什么这不起作用?

这应该可以说明:


基本上,您必须通过使用
ModelState.IsValid

触发模型验证,这应该可以说明:


基本上,您必须使用
ModelState.IsValid

触发模型验证。您需要在操作中明确检查
ModelState.IsValid
,如果不正确,则返回编辑视图。

如果显示无效模型的编辑视图,MVC将通过验证帮助程序自动显示错误消息。

您需要在操作中明确检查
ModelState.IsValid
,如果不是,则返回编辑视图。

如果显示无效模型的编辑视图,MVC将通过验证帮助程序自动显示错误消息。

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


有关更多详细信息,请参阅thsi链接

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


有关更多详细信息,请参阅thsi链接

我建议首先检查您是否按照正确的顺序包含了必要的javascript文件,以便在客户端成功进行验证

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

因此,在
AjaxOptions
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 });
}

我建议首先检查您是否以正确的顺序包含了必要的javascript文件以进行不引人注目的验证,这将使验证在客户端成功进行

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

因此,在
AjaxOptions
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 });
}

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

好的,问题是Telerik脚本注册器没有引用正确的JQuery。现在它正在工作。我直接引用了JQuery库,也引用了验证脚本。在Telerik脚本注册器上,它已经是默认组的一部分,