技术开发 频道

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

  校验

 因为一个页面可能有多个需要校验的区域,因此我们需要提供一个机制,能够保存多个“批次”的校验信息。于是,我们编写一个JQueryValidation类用来存放“一批”校验信息:

public class JQueryValidation

 {

 public JQueryValidation(ViewPage page)

 {

 this.Page = page;

 }

 public ViewPage Page { get; private set; }

 ...

 }

 当然,在JQueryHelper这个入口上,需要有一个访问校验信息的方式。在这里,我们使用字符串来标识“一批”校验信息。此外,我们也提供了默认重载以方便某些简单场景下的使用:

public static class JQueryValidationExtensions

 {

 public static JQueryValidation Validate(this JQueryHelper jquery)

 {

 return jquery.Validate("(default)");

 }

 public static JQueryValidation Validate(this JQueryHelper jquery, string name)

 {

 var key = typeof(JQueryValidation) + "+" + name;

 var page = jquery.Page;

 var validation = page.Items[key] as JQueryValidation;

 if (validation == null)

 {

 page.Items[key] = validation = new JQueryValidation(page);

 }

 return validation;

 }

 }

 作了那么多的铺垫,接下来便是最关键辅助方法编写了。通过对JavaScript代码进行分析之后,我们决定采用典型的“记录 - 汇总”模式来编写这个方法1。“记录 - 汇总”模式的原则便是通过“记录”将信息汇总后输出,在作为页面辅助方法时,我们可以在任何地方“记录”校验信息,然后在合适的地方输出一段汇总后的脚本。由于我们所需要的JavaScript非常规整,因此实现这个需求并不困难。

 首先是记录,对于每个

public class JQueryValidation

 {

 private Dictionary<string, Dictionary<string, object>> m_rules =

 new Dictionary<string, Dictionary<string, object>>();

 private Dictionary<string, Dictionary<string, string>> m_messages =

 new Dictionary<string, Dictionary<string, string>>();

 private void AddRuleAndMessage(string name, string rule, object value, string m

 {

 if (!this.m_rules.ContainsKey(name))

 this.m_rules[name] = new Dictionary<string, object>();

 this.m_rules[name][rule] = value;

 if (!String.IsNullOrEmpty(message))

 {

 if (!this.m_messages.ContainsKey(name))

 this.m_messages[name] = new Dictionary<string, string>();

 this.m_messages[name][rule] = message;

 }

 }

 public void Required(string name, string message)

 {

 this.AddRuleAndMessage(name, "required", true, message);

 }

 public void Email(string name, string message)

 {

 this.AddRuleAndMessage(name, "email", true, message);

 }

 public void Number(string name, string message)

 {

 this.AddRuleAndMessage(name, "number", true, message);

 }

 public void Range(string name, int min, int max, string message)

 {

 this.AddRuleAndMessage(name, "range", new int[] { min, max }, message);

 }

 ...

 }

 我们使用两个字典分别存放规则的描述(m_rules)与错误提示(m_messages),由于信息的统一,我们只需编写一个AddRuleAndMessage方法便可满足所有需要,而其他的方法只是定义了一个良好的接口,然后简单地把信息委托给AddRuleAndMessage而已。

 最后便是汇总,我们使用JavaScriptSerializer把规模的描述与错误提示序列化成JSON字符串并输出:

public string ToScripts(string form)

 {

 JavaScriptSerializer serializer = new JavaScriptSerializer();

 StringBuilder builder = new StringBuilder();

 builder.Append("$(");

 serializer.Serialize(form, builder);

 builder.Append(").validate(");

 serializer.Serialize(

 new

 {

 rules = this.m_rules,

 messages = this.m_messages,

 onkeyup = false

 }, builder);

 builder.Append(");");

 return builder.ToString();

 }

0
相关文章