校验
因为一个页面可能有多个需要校验的区域,因此我们需要提供一个机制,能够保存多个“批次”的校验信息。于是,我们编写一个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();
}