在编写ASP.NET MVC应用程序时,只依赖内置的视图辅助方法很难达到很高的生产力,即使是定义在MvcFutures中的补充类库,也很难满足项目的具体需求。此外,不同的项目有不同的特点,在很多时候也需要定义较为特殊的辅助方法,使开发人员能够更快,更方便地写出更容易维护的代码。这也是自定义视图辅助方法最主要的目的(没有之一)。而这次的文章,便是给出一个这方面的示例,可作为此类问题的一个参考。
预备
在编写客户端HTML时,进行客户端验证是最常见的工作之一。既然ASP.NET MVC集成了jQuery类库,那么我们不妨基于jQuery的Validate插件编写这部分功能。假设有如下表单:
<form method="post" action="" id="form">
<p>
<span>Name: </span> <!-- 必填 -->
<input type="text" name="user.Name" />
</p>
<p>
<span>Age: </span> <!-- 必填,15到28之间的数字 -->
<input type="text" name="user.Age" />
</p>
<p>
<span>Email:</span> <!-- 必填,且为合法Email -->
<input type="text" name="user.Email" />
</p>
<input type="submit" value="Submit" />
</form>
如果使用JQuery Validate插件进行客户端校验,那么我们可以编写如下代码:
<script language="javascript" type="text/javascript">
$("#form").validate({
"rules": {
"user.Name": { "required": true },
"user.Age": {
"required": true,
"number": true,
"range": [15, 28]
},
"user.Email": {
"required": true,
"email": true
}
},
"messages": {
"user.Name": { "required": "please provide your name!!!" },
"user.Email": {
"required": "email please...",
"email": "valid email please..."
}
}, "onkeyup": false
});
</script>
以上这段脚本的作用便是告诉jQuery校验哪个表单,对表单中的各个元素分别采取哪种校验方式,以及在发生错误的时候该提示什么信息(详细内容可查阅文档)。这里可能需要补充一段题外话。实际上jQuery.Validate非常灵活,可以有各种方式提供校验信息,例如直接为html元素加特殊标记。不过老赵认为那些方法的trick意味太浓,且不容易编写辅助方法协助开发,因此刻意忽略那些方式。
这样的结果可能会招一些前台开发人员欢喜,不过老赵觉得,至少有三个地方需要提高:
数据分散,提高维护难度。例如HTML元素和校验规则分离,校验规则
对于开发人员来说,编写JSON较不方便,容易发生错误。
缺少对于“自动校验”的支持,需要完全手写。
而我们编写的辅助方法,主要就是面向前两点,而最后一点可以说是自然而然的事情。