如何使用ASP.NET MVC手动启用jQueryvalidation

我正在努力理解与ASP.NET MVC连接的jQueryvalidation的一些基础知识。

这个问题的简短版本是:我遗漏了哪些魔法允许@Html.EditorFor()生成的代码执行jQueryvalidation,但是不起作用我尝试使用完全相同的HTML连接我自己的jQueryvalidation?

作为一个学习练习(因为它模仿我在网站上真正想做的事情)我在Visual Studio 2012中创建了一个新的MVC 4应用程序。我添加了一个视图模型:

 using System.ComponentModel.DataAnnotations; namespace ValidationTest.Models { public class MyViewModel { [Required] public string MyStringValue { get; set; } } } 

我修改了Views \ Home \ Index.cshtml来创建一个基于我的视图模型的表单,如下所示:

 @model ValidationTest.Models.MyViewModel @using (Html.BeginForm(new { id = "MyForm" })) { @Html.LabelFor(m => m.MyStringValue) @Html.EditorFor(m => m.MyStringValue) @Html.ValidationMessageFor(m => m.MyStringValue) 
}

最后,我修改了Home控制器,将视图模型提供给表单并处理相关的POST,如下所示:

 using System.Web; using System.Web.Mvc; using ValidationTest.Models; namespace ValidationTest.Controllers { public class HomeController : Controller { [HttpGet] public ActionResult Index() { var viewModel = new MyViewModel(); return View(viewModel); } [HttpPost] public ActionResult Index(MyViewModel viewModel) { if (!ModelState.IsValid) return View(viewModel); return RedirectToAction("About"); } public ActionResult About() { ViewBag.Message = "Your app description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } } 

当我运行项目时,网页会显示一个文本框,并神奇地validation用户是否必须输入值。 到现在为止还挺好…

现在,我的实际应用程序是一个在线调查。 它根据脚本显示问题并征求答案。 我的实际viewmodel包含映射到问题文本的属性,用户提供的值等.viewmodel还包含一个Boolean Required属性,指定用户是否必须提供值(即,是否启用视图中的“必需”validation – 所以这意味着我需要删除viewmodel中MyStringValue属性的[Required]属性,并根据viewmodel中的Required属性提供我自己的validation魔术。

这是我迷路的地方。 在IE中,我可以看到示例应用程序(如上所述)中的@ html.xxx调用为表单生成以下HTML:

    

但我没有在页面的其他地方看到任何明显引用jQueryvalidation库的HTML,也没有看到启用validation的JavaScript代码,所以我不明白为什么这样做有用。

此外,如果我删除[Required]属性,并硬编码View以发出上述HTML(没有magic @ html.xxx()调用),则根本不会进行validation。

我错过了什么?

是的,我错过了一些非常基本的东西。

为新的MVC 4项目创建的页面模板(_Layout.cshtml)在页面末尾包含此代码:

  @Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false)   

该代码引入了jQuery库(在浏览器看到页面上的所有HTML之后),然后呈现可由视图提供的可选“部分”。 该代码不会引入jQueryvalidation库。

ASP.NET MVCvalidation在没有jQueryvalidation的情况下工作,但所有validation都在服务器中完成。 细心的观察者会注意到,一旦警告必须提供缺少的字符串值,客户端validation只需在冒犯的文本框中输入单个字符即可消除警告。 但是,如果未启用jQueryvalidation,则键入文本框不会动态删除警告。

为了“打开”单个视图的jQueryvalidation,这段代码需要驻留在视图的cshtml文件中(风格上,它希望位于文件的末尾,因为它将显示在HTML的末尾) :

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

所以,我的问题的简短回答是在Views \ Home \ Index.cshtml文件的末尾添加上面的代码。 这使得jQueryvalidation,魔术发生,并且不再忽略data-xxx属性。 生活很好。

没有你想要的魔法。 Microsoft“不显眼的validation”脚本可以在任何使用jquery和jqueryvalidation的网站中使用。 它与ASP.NET无关 – 只要HTML是不显眼的脚本所期望的格式,那么脚本就可以工作。 这个小提琴显示了应用于非ASP.NET生成的表单的不显眼的脚本 。

不显眼的脚本有两个主要任务:

  1. 初始化jquery.validate.js插件
  2. 读取标记中的data-val *属性并将其转换为jqueryvalidation规则

您可能已经阅读过 ,不显眼的脚本读取的标记属性如下所示

 data-val="true" data-val-rulename="message" data-val-rulename-paramname1="paramvalue" data-val-rulename-paramname2="paramvalue" 

所以输入字段可能如下所示

   

我对这个不引人注目的剧本的个人看法是,它属于史蒂夫桑德森在他的MVC书中称之为’demoware’的范畴。 它开箱即可做出一些不错的东西,但它会让jqueryvalidation变得更容易,而且它本身更容易使用。 当我开始一个新项目时,我倾向于删除它。