ASP.NET MVC 4 – 客户端validation不起作用

我正在使用Visual Studio 2012,我无法获得自定义属性客户端逻辑,以便以较小的规模重现,我创建了一个新的MVC 4项目,我创建了以下模型和属性,永远不会validation

public class MyModel { public int Id { get; set; } [Required] public string LastName { get; set; } [NeverValid(ErrorMessage="Serverside Will Never Validate")] public string FirstName { get; set; } } public class NeverValidAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) { return false; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName }); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = this.ErrorMessage, ValidationType = "nevervalid" }; } } 

然后我将以下操作添加到HomeController中

 public ActionResult Index() { return View(new MyModel()); } [HttpPost] public ActionResult Index(MyModel model) { if (!ModelState.IsValid) { // Will Always Be Invalid } return View(model); } 

还有一个名为nevervalid.js的javascript文件

 $(function () { $.validator.addMethod("nevervalid", function () { return false; }, "Clientside Should Not Postback"); $.validator.unobtrusive.adapters.addBool("nevervalid"); }); 

和索引视图

 @model CustomAttribute.Models.MyModel @{ ViewBag.Title = "Home Page"; } @using (Html.BeginForm()) { @Html.ValidationSummary(true) 
MyModel @Html.HiddenFor(model => model.Id)
@Html.LabelFor(model => model.LastName)
@Html.EditorFor(model => model.LastName) @Html.ValidationMessageFor(model => model.LastName)
@Html.LabelFor(model => model.FirstName)
@Html.EditorFor(model => model.FirstName) @Html.ValidationMessageFor(model => model.FirstName)

} @section Scripts { @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/Scripts/nevervalid.js") }

我的web.config中的相关区域如下所示

        

当页面加载时,加载以下文件(从chrome的F12下的网络选项卡获取)

 http://localhost:7440/ http://localhost:7440/Content/site.css http://localhost:7440/Scripts/modernizr-2.5.3.js http://localhost:7440/Scripts/jquery-1.7.1.js http://localhost:7440/Scripts/jquery.unobtrusive-ajax.js http://localhost:7440/Scripts/jquery.validate.js http://localhost:7440/Scripts/jquery.validate.unobtrusive.js http://localhost:7440/Scripts/nevervalid.js 

并且我的自定义属性将相关的外观数据添加到第一个名称输入中,如此…

   

所以,我问你,为什么哦为什么这个东西必须回发做服务器端validation,而我在这里有一些完美的javascript代码? 在某个山顶上的一个没有月亮的夜晚,我是否必须牺牲一些动物?

我想知道如果你改变了nevervalid.js将会发生什么,以便代码在文档准备好之前执行。

我的基本思想是,当dom准备就绪时,通过解析文档来进行不显眼的validation…但如果你在同一时间/之后加载自定义validation内容,它就不会知道当它到来时该做什么你自定义validation数据属性。

无论如何,尝试将nevervalid.js改为简单地:

 (function($) { $.validator.addMethod("nevervalid", function () { return false; }, "Clientside Should Not Postback"); $.validator.unobtrusive.adapters.addBool("nevervalid"); })(jQuery);