热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过扩展方法链式方法为MVC3视图添加验证

.Net3.0添加了一个语法糖就是扩展方法,其实扩展方法的本质就是对类的静态方法的调用,虽然扩展方法只是改变了我们写代码的方式,但是如果我

.Net 3.0 添加了一个语法糖就是扩展方法,其实扩展方法的本质就是对类的静态方法的调用,虽然扩展方法只是改变了我们写代码的方式,但是如果我们使用得当,可以给我们带来巨大的编码效率的提升。对于C#扩展方法的使用,我就不细说了,贴段代码说明扩展方法的使用,大家就会回忆起来。

1 public static class Extensions
2 {
3 public static string EndWith(this string str)
4 {
5 return str + "@";
6 }
7 }

对于这段非常简单的代码,相信大家应该会很明白,可以看到扩展方法的使用,就是在一个静态类中定义一个静态方法,在方法参数中添加this。

那么使用扩展方法就更加的简单了。以下代码片段就是扩展方法对于string的扩展,会在页面上显示@

1 string str = "";
2 Response.Write(str.EndWith());

扩展方法不是本次课题的重点,本次课题的重点是说明如何利用扩展方法来链式的对MVC 3中的页面进行验证。对于Mvc的验证,有很多种方式,其中

我们经常使用的就是Model的验证,这是最直接最有效的我们操作的方式,可以对一个字段进行多个条件的验证。但是这种验证方式有一个弊端,就是我

们不能在页面上直接看到对该字段进行了哪些验证,除非我们去Model层查看,但是通常一个项目是分项目组的,我们不一定负责开发Model层,所以这

就会遇到一个沟通的问题。我们都知道,程序员的沟通成本是很高的。

现在提供另一种进行页面验证的方式,这种方式也可以对一个页面元素进行多个条件的验证,并且是在客户端进行的。要使用这个验证,我们必须了解一

个jquery的插件,那就是jquery.validation.js文件,这个是对元素进行验证的js文件。

还有一个我们必须了解的知识点就是?Mvc 3的Razor 视图直接继承自哪个类?相信很多朋友都会毫不犹豫的说是ViewPage,当然这不能说是错的,因

为Mvc 2 确实是继承自ViewPage基类,但是在Razor 视图下,是继承自WebViewPage类的,如果你的扩展方法扩展的是ViewPage,那么对不起,你

在页面上是无法看到这个扩展方法的,除非继承自WebViewPage。希望大家扩展页面方法的时候注意一下类的继承问题。

说了准备工作,那么我们切入正题,先贴出来代码,然后我们再逐渐的分析。

1 namespace MvcWeb.Extensions
2 {
3 public class JqueryHelper
4 {
5 public ViewContext ViewContext { get; private set; }
6
7 public WebViewPage ViewPage { get; private set; }
8
9 public RouteCollection RouteCollection { get; private set; }
10
11 public JqueryHelper(ViewContext viewContext, WebViewPage page, RouteCollection routeCollection)
12 {
13 this.ViewContext = viewContext;
14 this.ViewPage = page;
15 this.RouteCollection = routeCollection;
16 }
17
18 public JqueryHelper(ViewContext viewContext, WebViewPage viewPage) : this(viewContext, viewPage, RouteTable.Routes) { }
19 }
20
21 public static class JqueryExtensions
22 {
23 public static JqueryHelper Jquery(this WebViewPage page)
24 {
25 var key = typeof(JqueryHelper);
26 var jquery = page.PageData[key] as JqueryHelper;
27 if (jquery == null)
28 {
29 page.PageData[key] = jquery = new JqueryHelper(page.ViewContext, page);
30 }
31 return jquery;
32 }
33 }
34
35 public class JqueryValidations
36 {
37 public WebViewPage Page { get; private set; }
38 public JqueryValidations(WebViewPage page)
39 {
40 this.Page = page;
41 }
42 private Dictionary<string, Dictionary<string, object>> m_rules &#61; new Dictionary<string, Dictionary<string, object>>();
43 private Dictionary<string, Dictionary<string, object>> m_message &#61; new Dictionary<string, Dictionary<string, object>>();
44
45 public void Required(string name,string message)
46 {
47 this.AddRuleAndMessage(name, "required", true, message);
48 }
49
50 public void Email(string name, string message)
51 {
52 this.AddRuleAndMessage(name,"email",true,message);
53 }
54
55 public void Number(string name, string message)
56 {
57 this.AddRuleAndMessage(name, "number", true, message);
58 }
59 public void Range(string name,int min,int max, string message)
60 {
61 this.AddRuleAndMessage(name, "range", new int[] { min, max }, message);
62 }
63 public string ToScripts(string form)
64 {
65 JavascriptSerializer serializer &#61; new JavascriptSerializer();
66 StringBuilder builder &#61; new StringBuilder();
67
68 builder.Append("$(");
69 serializer.Serialize(form, builder);
70 builder.Append(").validate(");
71 serializer.Serialize(
72 new
73 {
74 rules &#61; this.m_rules,
75 messages &#61; this.m_message,
76 onkeyup &#61; false
77 }, builder);
78 builder.Append(");");
79
80 return builder.ToString();
81 }
82
83 public ValidationElement Element(string name)
84 {
85 return new ValidationElement(name, this);
86 }
87 private void AddRuleAndMessage(string name, string rule, object value, string message)
88 {
89 if (!this.m_rules.ContainsKey(name))
90 {
91 this.m_rules[name] &#61; new Dictionary<string, object>();
92 }
93 this.m_rules[name][rule] &#61; value;
94
95 if (!string.IsNullOrEmpty(message))
96 {
97 if (!this.m_message.ContainsKey(name))
98 {
99 this.m_message[name] &#61; new Dictionary<string, object>();
100 }
101 this.m_message[name][rule] &#61; message;
102 }
103
104 }
105
106
107 }
108
109 public class ValidationElement
110 {
111 public ValidationElement(string name, JqueryValidations validations)
112 {
113 this.Name &#61; name;
114 this.Validations &#61; validations;
115 }
116
117 public string Name { get; private set; }
118
119 public JqueryValidations Validations { get; private set; }
120
121 public ValidationElement Required(string message)
122 {
123 this.Validations.Required(this.Name, message);
124 return this;
125 }
126
127 public ValidationElement Email(string message)
128 {
129 this.Validations.Email(this.Name, message);
130 return this;
131 }
132
133 public ValidationElement Number(string message)
134 {
135 this.Validations.Number(this.Name, message);
136 return this;
137 }
138
139 public ValidationElement Range(int min, int max, string message)
140 {
141 this.Validations.Range(this.Name, min, max, message);
142 return this;
143 }
144
145 }
146
147 public static class JQueryValidationExtensions
148 {
149 public static JqueryValidations Validations(this JqueryHelper jquery)
150 {
151 return jquery.Validations("(default)");
152 }
153
154 public static JqueryValidations Validations(this JqueryHelper jquery, string name)
155 {
156 var key &#61; typeof(JqueryValidations) &#43; "&#43;" &#43; name;
157 var page &#61; jquery.ViewPage;
158 var validations &#61; page.PageData[key] as JqueryValidations;
159
160 if (validations &#61;&#61; null)
161 {
162 page.PageData[key] &#61; validations &#61; new JqueryValidations(page);
163 }
164
165 return validations;
166 }
167 }
168
169 }

在这段代码中定义了JqueryHelper 类&#xff0c;是对WebViewPage的扩展&#xff0c;其中有一个方法ToScript 我们要特别注意一下&#xff0c;这个方法是在页面上显示一段拼

接的js&#xff0c;也就是jquery.validation.js会用到的验证页面元素的js。

具体代码我就不细说了&#xff0c;我介绍一下基本思想吧。首先我们定义了一个JqueryHelper类&#xff0c;然后顶一个JqueryValidation类来定义对页面元素可以进行的

验证。这里面有一个链式方法必须用到的就是每个验证方法返回的结果都是JqueryValidation类的对象&#xff0c;这样我们才可以进行链式操作。

通过Dictionary来存储验证的标签Name属性值&#xff0c;错误信息&#xff0c;以及验证规则&#xff0c;最后根据这些值在ToScript中拼接出可以提交的js。

好了&#xff0c;来看个结果&#xff0c;大家就会更加清楚这个链式方法的用途所在了。

1 &#64;{
2 Layout &#61; null;
3 }
4 &#64;using MvcWeb.Extensions
5
6
7
8
9
10
11
12
13
14


15 "form" action&#61;"" method&#61;"post">
16 "text" id&#61;"user.Name" name&#61;"user.Name" />
17 &#64;{ this.Jquery().Validations().Required("user.Name","用户名是必填的 亲");}
18
19 <select name&#61;"user.Gender">
20
21
22
23 select>
24
25 &#64;{ this.Jquery().Validations().Required("user.Gender", null);}
26
27 "text" name&#61;"user.Email" />
28 &#64;{this.Jquery().Validations().Element("user.Email").Required("邮箱是必填的").Email("请填写正确的邮箱格式");}
29 "submit" value&#61;"提交" />
30
31

32
35
36

对于在页面中实现验证的方法&#xff0c;我介绍一下咱们应该注意的地方

  1. 就是我们必须引入对应的js文件&#xff0c;如果我们不引入jquery.validation.js文件&#xff0c;那么验证也是不成功的

  2. 必须把要验证的元素放到form标签内

  3. 就是我们在通过链式方法验证元素的时候应该注意顺序&#xff0c;虽然说任何顺序都是可以的&#xff0c;但是我们也要按照业务逻辑来对验证顺序进行调整

  4. 最后我们通过一个submit按钮来进行提交&#xff0c;可能有人要用ajax等其他方式来提交页面&#xff0c;我可以告诉你&#xff0c;我尝试了一下&#xff0c;这样不会触发前端js的验证

  5. 最后我们必须要通过ToScript方法来拼接出验证的js&#xff0c;在Mvc中框架会自动进行编码&#xff0c;所以我们要求框架不要编码。如果没有要求框架

    不要编码&#xff0c;那么最后得到的js结果就是编码过的js&#xff0c;这不是我们要的结果。具体你可以查看源代码看一下执行结果


    最后还是有图有真相 
    1。初始界面显示

2.如果有些条件不满足&#xff0c;那么就会在界面上显示错误信息&#xff0c;当然这是可定制的。在我

在我调试代码的时候&#xff0c;我发现在IE9下&#xff0c;有时候错误信息显示的不是很实时&#xff0c;在火狐下显示的很正常&#xff0c;可能有些问题需要解决。但是不影响使用。

总结一下&#xff0c;链式方法我们其实也经常看到&#xff0c;在我们使用linq的时候&#xff0c;有时会有很多个方法链接使用&#xff0c;提高了程序的可读性。但是我们在设计可

以用来进行链式方法操作的时候一定要注意的就是所有的链式方法的返回值类型尽量相同&#xff0c;因为这便于我们不需要掌握顺序。有的园友会提出

不同意见&#xff0c;linq语法就不是所有的返回值类型都相同&#xff0c;但是我们要知道&#xff0c;我们在使用linq的时候&#xff0c;方法的调用顺序是很重要的对吧。

强调一下&#xff0c;扩展方法不是真的在原有类中添加了一个方法&#xff0c;而是相当于调用的静态类中的静态方法实现的。

天色已黑&#xff0c;我们还在努力。坚强的我们&#xff0c;肯定会有美好的明天。

 

 



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文深入解析了 jQuery 中用于扩展功能的三个关键方法:`$.extend()`、`$.fn` 和 `$.fn.extend()`。其中,`$.extend()` 用于扩展 jQuery 对象本身,而 `$.fn.extend()` 则用于扩展 jQuery 的原型对象,使自定义方法能够作为 jQuery 实例的方法使用。通过这些方法,开发者可以轻松地创建和集成自定义插件,增强 jQuery 的功能。文章详细介绍了每个方法的用法、参数及实际应用场景,帮助读者更好地理解和运用这些强大的工具。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • Python应用实例大揭秘:七大令人惊叹的高阶技巧展示
    2020年,Python无疑成为了最炙手可热的编程语言,其影响力已远远超出程序员的范畴。从初学者到资深从业者,甚至小学生,都在纷纷加入Python的学习热潮中。凭借其低门槛、易上手和强大的功能,Python正逐渐成为各行业不可或缺的工具。本文将揭示七个令人惊叹的Python高级应用技巧,帮助读者进一步提升编程水平。 ... [详细]
author-avatar
玩在青岩堡欢乐长桌宴_840
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有