telerik 为 .net 开发 web 应用提供了一套比较完整的页面控件解决方案,除了自带 AJAX 框架外也对 ATLAS/ASP.NET AJAX 提供了支持。一直都是久闻大名,最近试用了一下,大致记录如下。
关于控件的安装,官方文档写得比较清楚,过程也很简单,就不在这里唠叨了。
每个控件都提供声明语法和动态生成,通过声明语法可以非常简单地以默认形式在页面上放置一个控件(以日历控件为例)。
页首引用:
<%@ Register TagPrefix="telerik" Assembly="RadCalendar.Net2" Namespace="Telerik.WebControls" %>
页面声明:
<telerik:RadCalendar ID="tCalendar1" RadControlsDir="~/RadControls/" LicenseFile="~/bin/LicenseFile.xml" runat="server" />
RadControls 文件夹中是控件需要用到的客户端资源,LicenseFile 属性设置 License 文件的地址,如果是按照安装文档默认安装,则可以省略以上两个属性的设置。
Window
Window 控件是 telerik 控件中唯一可以绑定到 window 事件的控件,可以通过很多方法打开窗口:
1. 最简单的方法是设置 OpenerElementId 属性为一个按钮的客户端 id 或者 <%# ServerButton.ClientID %>,但使用绑定方式得确保 DataBind() 方法在页合适的声明周期内被调用。
2. 使用 window.radopen 方法或是 GetRadWindowManager().Open 方法。
3. 点击链接显示窗口可以这样:<a onclick='window.radopen(null, "GoogleWindow");' target="GoogleWindow">google</a>
4. 在一个窗口中再开子窗口 var wnd = GetRadWindowManager().GetActiveWindow.BrowserWindow; wnd.radopen("http://www.google.com", "ParentWindow");
其中的 ParentWindow 应该是窗口控件的名称,BrowserWindow 代表了浏览器的 window 对象。
与子窗口传递参数的问题
可以通过打开窗口的 url 来传递参数(),目标页通过 Request 获取,不过这种情况传递的信息要受到 url 方式传参的长度限制(个人推测,因为 http 的 get 方法是有长度限制的)。
如果想传递服务端的对象恐怕只能借助 Session 了(目前没发现更好的方法,可以参见这个帖子),如果想传递的信息可以在客户端生成,可以借助 Argument 属性,官方网站提供了一个例子。
Upload
Telerik 的 Upload 控件提供了内存优化功能:默认情况下上传的文件保存在内存中,服务器内存上限限制了文件上传的尺寸,RadUploadHttpModule 可以把内存中的流保存到临时文件夹使上传超过2GB的文件成为可能(不过让用户通过 web 上传超过 2GB 的文件在我看来真的有点 bt )。
Upload 控件提供自动保存文件功能,需要设置 TargetFolder 属性或 TargetPhysicalFolder 属性,可以通过 OverwritingExistingFiles 属性设置文件同名时控件的行为;不使用自动保存也很方便,从 UploadedFiles 集合中获取 UploadedFile 实例调用 SaveAs 方法即可,也可以获取实例的 InputStream 。
Upload 控件提供客户端和服务端的文件验证,客户端的验证只能提供对文件扩展名的验证,可以一定程度上提高用户的体验,但服务端的验证总是必要的。
如果通过 AllowedFileExtensions=".zip,.jpg,.jpeg", AllowedMimeTypes 和 MaxFileSize 属性启用文件验证功能, 通过文件验证的文件将被临时存放在 UploadedFiles 集合中,反之则存在 InvalidFiles 集合中。
文件上传在 Web 开发中是一个比较有个性的控件,所以很多 AJAX 框架总是要自带定制的文件上传控件。Telerik 的 Upload 控件提供的客户端模型主要是针对界面处理的方法和事件,因为 Window 控件主要是通过客户端进行处理,所以当这两个控件结合使用的时候就要非常小心不要在客户端暴露太多不安全的信息,比如说让 Window 的目标页不能单独在浏览器中显示,去掉状态栏的地址信息,对 javascript 进行保护,然后还需要在文件提交前后进行充分地校验。
Ajax
从 1.6 版开始 License 政策有所改变,不再使用 LicenseFile.xml 进行验证,而是购买后重新下载二进制文件的方式。未购买的控件会随机产生试用信息,试用信息通过每个控件的程序集中都有的 Telerik.WebControls.RadXXXUtils.Licensing.GetLicenseMessage() 方法获得。
Telerik 相对于其它 AJAX 框架为部分更新提供了不同的模式,其它 AJAX 框架通常需要在部分更新的位置添加一个 UpdatePanel ,而 Telerik 只需要在页的底部添加一个 RadAjaxManager 即可。而且可以在 vs2005 设计时通过简单的方法设置触发控件和触发后局部更新的面板以及在回调过程中出现的 Loading 面板(可参见官方的文档)。代码模型如下:
<AjaxSettings>
<telerik:AjaxSetting AjaxControlID="triggerC">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="aspPanel1" LoadingPanelID="ajaxLoadingPanel1" />
</UpdatedControls>
</telerik:AjaxSetting>
</AjaxSettings>
</telerik:RadAjaxManager>
<telerik:AjaxLoadingPanel ID="ajaxLoadingPanel1" runat="server">
<asp:Image ImageUrl="~/RadControls/Ajax/Skins/Default/loading.gif" runat="server" />
</telerik:AjaxLoadingPanel>
在这种场景下需要注意的问题就是要通过 Callback 局部更新的面板"aspPanel1"必须是永远可见的。
从目前情况来看,各种 AJAX 框架兼容性最好的字符集都是 "UTF-8",Telerik 也不例外,所以最好就是在 web.config 中设置:
<globalization requestEncoding="UTF-8" fileEncoding="UTF-8" responseEncoding="UTF-8"/>
至于通过程序进行编码转换,官方文档也给了一个简单有效的示例。
陆续更新...