我正在努力理解与 ASP.NET MVC 连接的 jQuery 验证的一些基础知识。
这个问题的简短版本是:我错过了什么魔法,允许生成的代码@Html.EditorFor()
执行 jQuery 验证,但不起作用我尝试使用完全相同的 HTML 连接我自己的 jQuery 验证?
作为学习练习(并且因为它模仿了我在网站中真正想做的事情),我在 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)
<br />
<input type="submit" value="Submit" />
}
最后,我修改了 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();
}
}
}
当我运行项目时,网页会显示一个文本框并神奇地验证用户必须输入一个值。到现在为止还挺好...
现在,我的实际应用是在线调查。它根据脚本显示问题并征求答案。我的实际视图模型包含映射到问题文本的属性、用户提供的值等。视图模型还包含一个布尔必需属性,它指定用户是否必须提供一个值(即是否启用视图中的“必需”验证) - 所以这意味着我需要删除[Required]
视图模型中 MyStringValue 属性上的属性,并根据视图模型中的 Required 属性提供我自己的验证魔法。
这就是我迷路的地方。在 IE 中,我可以看到示例应用程序中的 @html.xxx 调用(如上所述)为表单生成了以下 HTML:
<label for="MyStringValue">MyStringValue</label>
<input class="text-box single-line"
data-val="true"
data-val-required="The MyStringValue field is required."
id="MyStringValue"
name="MyStringValue"
type="text"
value="" />
<span data-valmsg-for="MyStringValue" data-valmsg-replace="true"></span>
但是我在页面上的其他地方看不到任何明显引用 jQuery-validation 库的 HTML,也没有看到启用验证的 JavaScript 代码,所以我根本不明白为什么会这样。
此外,如果我删除该[Required]
属性,并对 View 进行硬编码以发出上述 HTML(没有神奇的 @html.xxx() 调用),则根本不会发生验证。
我错过了什么?