这部分尚不见文档,所以在这里提几句,以便大家对其有个了解
validation framework(以下简称vf) 极大的依赖Spring.Expression ,关于Spring.Expression的简单介绍,可参见我在评测网的另一个贴子 http://bbs.dotnettools.org/NewsDetail.asp?id=5238 . 这里所说的基本上是我个人的理解,因此有些地方可能不对。
vf 特点 ①与经典的asp.net验证框架不同,vf 在页面上并没有验证逻辑,在页面上通常只有validationSummary和validationError控件,显示验证的结果,验证逻辑存在于ioc容器中。验证逻辑是可重用的,通常被部署为singleton ②验证 是一个整体的动作,即一次验证活动可以有一个或多个验证操作,因此,vf 通常用一个ValidatorGroup 来表达一次验证活动。一个组的可以通过ref(ValidatorReference来引用另一个组中的验证器 ③ 在spring.net web framework中,验证活动是手动调用的,通过Page.Validate(object validationContext,params IValidator[] validators)来进行。而经典的asp.net 验证是自动的,如果要跳过验证逻辑,必须设置causesvalidation属性为false
④对国际化支持相当完善。
每个validator通常都暴露test,when两个attribute,test是validator需要的表达式,when是是否执行该validator的表达式 每个validator可以有一批IValidationAction的实现列表,这个列表是表明验证后需要执行的活动.有两个预定义的活动ErrorMessageAction,ExpressionAction
在vf中,表达式可以使用validatecontext和一个parameters dictionary,vaidatecontext通常是要验证的对象,它是spring.net web framework Page.Validate方法传递的第一个参数。这个参数通常是domain object ,如一个用户注册页面,通常就是User 对象,而一个订单录入页面,通常就是Order对象了,如果没有对应的domain object,你可以创建一个或是通过page对象来引用页面上的控件。parameters在web framework中,由Page类创建并传入,下面是Page.createValidatorParameters的代码 private IDictionary CreateValidatorParameters() { IDictionary parameters = new ListDictionary(); parameters["page"] = this; parameters["session"] = this.Session; parameters["application"] = this.Application; parameters["request"] = this.Request; parameters["response"] = this.Response; parameters["context"] = this.Context;
return parameters; } 你可以在表达式中使用 #page #session #application #request #response #context 来引用这些对象 比方说一个登录页面,你可以显式的构造一个LoginInfo对象,如 public class LoginInfo { public String UserName; public String Password; } 在具体的登录代码中使用这个对象 protected void cmdLogin_Click(object sender, EventArgs e) { LoginInfo info=new LoginInfo(txtUserName.Text,txtPassword.Text);
if ( Page.Validate(info,loginValidator)) { //验证通过 } }
对于登录活动,这里显然需要有以下验证过程 用户名必须输入,口令必须输入 如果口令输入,则口令必须大于6位 我们来描述以下如何完成这个过程
<v:group id="loginValidator"> <v:required id="userNameValidator" test="UserName"> <v:message id="error.required" providers="usernameErrors, validationSummary"> <v:param value="#page.GetMessage('username')"/> </v:message> </v:required> <v:required id="passwordValidator" test="Password"> <v:message id="error.required" providers="passwordErrors, validationSummary"> <v:param value="#page.GetMessage('password')"/> </v:message> </v:required> <v:condition id="passwordLengthValidator" test="#page.wc2.txtPassword.Text.Length>6" when="#page.wc2.txtPassword.Text.Length>0"> <v:message id="error.length" providers="passwordErrors, validationSummary"> <v:param value="#page.GetMessage('password')"/> <v:param value="6"/> </v:message> </v:condition> </v:group>
这里定义一个ValidatorGroup loginValidator ,它包括两个validator,第一个是UserName必须输入,第二个是Password必须输入。如果第一个validator没通过,则显示message。message 的id是个资源字符串id,vf通过GetMessage获取这个资源字符串id对应的本地化字符串,它有可选的多个参数。这里error.required 在全局资源中定义为{0} 必须输入,下面的param 指示从调用GetMessage方法获取username的本地化字符串,最终它会显示 用户名 必须输入.password的验证同理。
这里,需要提一下param 的value总是会被转换称一个IExpression,所以这里可以使用表达式的所有功能
message的providers attributes 是很有意思的东西,他说明这个message给那个validationError控件用,如 <asp:TextBox ID="txtUserName" runat="server" /><spring:ValidationError ID="ValidationError1" Provider="usernameErrors" runat="server" /> 大家注意到ValidationError1的Provider attribute 定义为usernameErrors,显然,一个ValidationError可以使用多个message,只要其在message的providers列表中
上面已经说了,在具体的asp.net 页面中,只使用ValidationSummary和ValidationError控件。这两个控件的配置也很有意思 下面的例子是ioc中的配置 <object id="Spring.Web.UI.Controls.ValidationError" abstract="true"> <property name="Renderer"> <object type="Spring.Web.Validation.IconValidationErrorsRenderer, Spring.Web"> <property name="IconSrc" value="validation-error.gif"/> </object> </property> </object> <object id="Spring.Web.UI.Controls.ValidationSummary" abstract="true"> <property name="Renderer"> <object type="Spring.Web.Validation.DivValidationErrorsRenderer, Spring.Web"> <property name="CssClass" value="validationError"/> </object> </property> </object>
由于spring.net web framework 的Page类会对页面中的每个control调用ConfigureObject,因此,页面中的validationError,summaryError都会被配置。
要使用vf,首先你需要声明xml ns,如 <objects xmlns="http://www.springframework.net" xmlns:v="http://www.springframework.net/validation"> vf的配置解析Spring.Validation.ValidationConfigParser是个很好的例子,如何将配置简化而不使用固有的ioc xml配置描述。
|