为视图自定义辅助方法(上)

在编写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较不方便,容易发生错误。

缺少对于“自动校验”的支持,需要完全手写。

而我们编写的辅助方法,主要就是面向前两点,而最后一点可以说是自然而然的事情。

时间: 2024-10-28 15:17:17

为视图自定义辅助方法(上)的相关文章

为视图自定义辅助方法(下)

在上一篇文章中,我们把繁冗的客户端脚本变成了可以由Visual Studio提示并轻易输出的服务器端辅助方法.但是,目前的做法还有不少可以改进的地方.我们编写辅助方法的目的便是为了简化开发,因此我们还可以在这条路上走的更远,让开发人员可以在使用我们的API时觉得更流畅,更有快感. 简化入口 目前,我们的辅助方法的使用方法大约如下: <span>Name: </span> <!-- 必填 --> <input type="text" name=&

Html.Action和Html.RenderAction:ASP.NET MVC中的HTML辅助方法

Html.Action和Html.RenderAction Action是执行单独的控制器操作并显示结果,Action提供了更多的灵活性和重用性,因为控制器操作可以建立不用的模型,可以利用单独的控制器上下文,他们两个仅有的不同是:RenderAction可以直接写入响应流.下面看一下代码: public class MyController { public ActionResult Index() { return View(); } [ChildActionOnly] public Acti

Android开发入门(十五)使用菜单 15.1 辅助方法

菜单可以用来显示额外的选项,这些选项也不必出现在主界面中.在Android框架中,主要有2种菜单: 选项菜单 -- 显示与当前活动有关的信息.使用MENU键,可以触发这个菜单. 上下文菜单 -- 显示与活动中某一个视图相关的信息.长按一个视图,可以触发这个菜单. 开发入门(十五)使用菜单 15.1 辅助方法-正月十五菜单"> 左侧是 选项菜单,右侧是 上下文菜单. 在使用这两种菜单之前,我们先介绍一下两个辅 助方法.一个用来填充菜单中的选项列表,另一个用来处理菜单的选中事件. 1. 创建一

ASP.NET MVC 2博客系列之一:强类型HTML辅助方法

这是我针对即将发布的ASP.NET MVC 2所撰写的贴子系列的第一篇,这个博客贴子将讨论 ASP.NET MVC 2中新加的强类型HTML辅助方法. 现 有的HTML辅助方法 ASP.NET MVC 1中发布了一套HTML辅助方法,可以用来在视图模板中帮助生成HTML界面.例如,要输出一个文本框,你可以在你的.aspx视图模板中使用Html.TextBox()辅助方法编写下列代码: 上面辅助方法的第一个参数提供了文本框的名称及id,第二个参数指定了它该有的值,然后上面的辅助方法会显示象下面这样

ASP.NET MVC3学习心得-----表单和HTML辅助方法

 5.1表单的使用 5.1.1  action和method的特性 表单是包含输入元素的容器,包含按钮.复选框.文本框等元素,表单的这些输入元素使得用户能够向页面中输入信息,并把输入信息提交给服务器.Action特性告知浏览器将URL提交到哪里,method特性来说明用何种方式告知浏览器,默认为get方法 5.1.2Get和Post方法 1.如果不想让浏览器把输入值放入查询字符串中,而是想放入HTTP请求的主体中,可以为method赋值post,post可以用来提交信用卡信息.向购物车添加专辑或

艾伟_转载:ASP.NET MVC 2博客系列之一:强类型HTML辅助方法

这是我针对即将发布的ASP.NET MVC 2所撰写的贴子系列的第一篇,这个博客贴子将讨论 ASP.NET MVC 2中新加的强类型HTML辅助方法. 现有的HTML辅助方法 ASP.NET MVC 1中发布了一套HTML辅助方法,可以用来在视图模板中帮助生成HTML界面.例如,要输出一个文本框,你可以在你的.aspx视图模板中使用Html.TextBox()辅助方法编写下列代码: 上面辅助方法的第一个参数提供了文本框的名称及id,第二个参数指定了它该有的值,然后上面的辅助方法会显示象下面这样的

PowerPoint幻灯片演示者视图的使用方法

PowerPoint幻灯片演示者视图的使用方法   1.连接第二台显示器,模拟面向观众的投影屏幕 在电脑的显示输出接口上连接好第二台显示器,并接通它的电源.由于还没有进行任何设置,所以第二台显示器还是黑屏. 2.将电脑显示扩展到第二台显示器上 在第一台显示器上,访问控制面板-->外观和个性化-->显示-->连接到外部显示器,单击检测按钮,然后在多显示器下拉列表中选中扩展这些显示,最后单击下方的应用按钮.系统询问是否保留设置,单击保留更改,第二台显示器点亮;最后单击确定. 3.启动 Pow

Yii控制器中操作视图js的方法_php实例

本文实例讲述了Yii控制器中操作视图js的方法.分享给大家供大家参考,具体如下: //YII framework路径 Yii::getFrameworkPath(); //protected/runtime Yii::app()->getRuntimePath(); //protected/venders目录 Yii::import('application.venders.*'); //或在protected/config/main.php说明 'import'=>array( //....

Spring 怎么拦截自定义Controller方法级别的annotation

问题描述 1.现在我这么一个想法,在Controller的方法上添加一个注解,spring拦截到这个方法的时候,做一些日志处理操作.如:@RequestMapping(value="role_list.do")@LoggerFinder(operationType="查询日志列表")publicStringroleList(){return"role_list";} LoggerFinder是我自定义的注解类型publicclassLoggerI