Tag Archives: ASP.NET

ASP.NET MVC 3: 如何写一个支持unobtrusive客户端验证的Email Validation Attribute

ASP.NET MVC 3引入了对Unobtrusive Javascript的支持,结合jQuery Valiator插件,让客户端验证的Javascript代码与Html剥离开,使得页面代码更清晰简洁。关于如何使用,请猛击这里。 当需要验证一个Email字段是否合法,只需像ASP.NET MVC 2那样,使用RegularExpressionAttribute修饰一下即可。 ASP.NET MVC 会自动与jQuery Validator绑定,实现客户端的验证。而需要重用这个Email的验证时,只需自己写一个定制的EmailValidationAttribute。 并用它来代替RegualrExpressionAttribute加到属性上面。 这样做看似没有问题,但运行后发现,只有服务器端验证,而客户端验证并没有工作,这是为什么呢? 原来,ASP.NET MVC 3是通过IClientValidatable这个新的接口来实现客户端验证的,也就是说所有的要支持客户端验证的Attribute必须实现这个接口。 但RegualrExpressionAttribute并不是定义在MVC里面的,而是随着.NET 4.0发布的,放在System.ComponentModel.DataAnnotations.dll这个assembly里面,那他是如何实现客户端验证的呢? 查看一下MVC的源代码,发现其为这几个著名的DataAnnotation加了个Adapter。 而这Adapter做的事情,正是IClientValidatable接口需要做的,返回其ModelClientValidationRule。 所以,相应的,把这个正则表达式的ModelClientValidationRule加到Email验证里面就大功告成了。 Charles Vallance有一个直接的解决方案,定义一个ModelClientValidationRule,并将ValidationType设置为“email”。这样做也可以,但有一个问题。实际上,ValidationType对应的是jQuery Validator中定义的email验证方法。 查看jQuery Validator的源代码就可以发现,其使用的正则表达式比我们在服务器端使用的要复杂得多。此时,客户端验证与服务器端验证并不统一,留下后患。

Posted in ASP.NET MVC | Also tagged | Leave a comment

ASP.NET MVC 3: CS1973编译错误

今天在写代码的时候碰到一个CS1973编译错误。 代码如下: 发现问题了吗?下面是错误描述: Compiler Error Message: CS1973: ‘System.Web.Mvc.HtmlHelper<object>’ has no applicable method named ‘TextBox’ but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax. 通过描述发现,问题是出在ASP.NET MVC 3新引入的ViewBag上面,由于它实际是一个dynamic类型,而dynamic类型又不能使用扩展方面(Extension Method)。因为扩展方面是编译时的,是将扩展的类型传入静态方法。但dynamic的机制是运行时的,他需要运行时解析数据类型并调用其方法或属性。如果将dynamic类型传入扩展方法,编译器将无法选择合适的重载方法,将抛出此编译错误,注意是编译错误。 所以修复这问题的方法就是加一个类型转换,告诉编译器我们要调用哪个重载。 参考: ViewBag in ASP.NET MVC [...]

Posted in ASP.NET MVC | Also tagged | Leave a comment
Highslide for Wordpress Plugin