Bob*_*lth 17 asp.net-mvc jquery jquery-validate unobtrusive-validation asp.net-mvc-4
我正在努力理解与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; }
}
}
Run Code Online (Sandbox Code Playgroud)
我修改了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" />
}
Run Code Online (Sandbox Code Playgroud)
最后,我修改了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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行项目时,网页会显示一个文本框,并神奇地验证用户是否必须输入值.到现在为止还挺好...
现在,我的实际应用程序是一个在线调查.它根据脚本显示问题并征求答案.我的实际viewmodel包含映射到问题文本的属性,用户提供的值等.viewmodel还包含一个Boolean Required属性,指定用户是否必须提供值(即,是否启用视图中的"必需"验证 - 所以这意味着我需要删除[Required]viewmodel中MyStringValue属性的属性,并根据viewmodel中的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>
Run Code Online (Sandbox Code Playgroud)
但我没有在页面上的其他地方看到任何显然引用jQuery验证库的HTML,也没有看到启用验证的JavaScript代码,因此我不明白为什么这样做有用.
此外,如果我删除该[Required]属性,并硬编码View以发出上述HTML(没有magic @ html.xxx()调用),则根本不会进行验证.
我错过了什么?
Bob*_*lth 12
是的,我错过了一些非常基本的东西.
为新MVC 4项目创建的页面模板(_Layout.cshtml)在页面末尾包含此代码:
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
该代码引入了jQuery库(浏览器已经看到页面上的所有HTML之后),然后呈现可由视图提供的可选"部分".该代码并没有在jQuery验证库中取出.
ASP.NET MVC验证在没有jQuery验证的情况下工作,但所有验证都在服务器中完成.细心的观察者会注意到,一旦警告必须提供缺少的字符串值,客户端验证只需在冒犯的文本框中输入单个字符即可消除警告.但是,如果未启用jQuery验证,则键入文本框不会动态删除警告.
为了"打开"单个视图的jQuery验证,此代码需要驻留在视图的cshtml文件中的某个位置(风格上,它希望位于文件的末尾,因为它将显示在HTML的末尾) :
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题的简短回答是在Views\Home\Index.cshtml文件的末尾添加上面的代码.这使得jQuery验证,魔术发生,并且不再忽略data-xxx属性.生活很好.
Dr *_*ard 10
没有什么魔法可以让你失踪.Microsoft"不显眼的验证"脚本可以在任何使用jquery和jquery验证的网站中使用.它与ASP.NET无关 - 只要HTML是不显眼的脚本所期望的格式,那么脚本就可以工作. 这个小提琴显示了应用于非ASP.NET生成的表单的不显眼的脚本.
不显眼的脚本有两个主要任务:
您可能已经阅读过,不显眼的脚本读取的标记属性如下所示
data-val="true"
data-val-rulename="message"
data-val-rulename-paramname1="paramvalue"
data-val-rulename-paramname2="paramvalue"
Run Code Online (Sandbox Code Playgroud)
所以输入字段可能如下所示
<input
data-val="true"
data-val-required="This field is required..."
data-val-number="Please enter a number..."
data-val-range="Must be between 50 and 100...",
data-val-range-min="50"
data-val-range-max="100"
id="mynumber"
name="mynumber"
type="text" value="" />
Run Code Online (Sandbox Code Playgroud)
我对这个不引人注目的剧本的个人看法是,它属于Steve Sanderson在他的MVC书中所称的"demoware"类别.它开箱即用,但它有点惹人喜欢jquery验证,它更容易使用.当我开始一个新项目时,我倾向于删除它.