用Atlas Behaviors实现就地编辑(3) [译]

      --原文请见nikhilk.net的blog http://www.nikhilk.net/AtlasInPlaceEditSampleExtender.aspx
      这是本系列的第三部分也是最后一个部分,本文介绍InPlaceEditExtender服务器控件的实现,通过本组件,页面开发者不用去钻研客户端的脚本开发就可以很容易的实现就地编辑的功能 。
    这是实现就地编辑系列文章的第三部分,在第一部分,我介绍了如何用atlas实现就地编辑的功能(通过客户端和服务器端的联合编程)。第二部分中,介绍了客户端behavior通过脚本编写实现UI和功能逻辑,并且简洁优美的打包到一个可重用的脚本组件。本文中我将如何开发一个属性扩展组件,为你客户端behavior组件实现服务器端编程模型。
    我首先介绍了客户端behavior的实现,是由于我们要用它为基础实现我们的服务器端组件。服务器端控件模型的关键动机就是使页面开发人员不用研究客户端脚本编程,就可以轻易实现丰富表现的web应用开发。不幸的是,这里不存在快捷方法...要想在客户端实现真正有趣的事情,脚本是必需的,所以必须要有一些人来写这些脚本。在本例子的实现中,开发者[被认为是高级的]就需要写脚本。也因此普通的开发人员就可以简单的使用这些组件来进行应用开发。现在组件开发者可以使用atlas的脚本框架和其他的高级功能,以一种特别的在原始的JavScript和DHTML模型之上的方式实现规范的脚本逻辑,而不是把脚本胡乱的扔到页面中。
    注:属性扩展组件可以扩展现有控件的功能而不用重新开发新的控件。就象客户端的behavior一样,我认为这是一个相当诱人的模型,这可以避免为了某些功能去构造大量的控件。同样的一个TextBox控件可以关联到多个属性扩展组件以实现更多的不同的功能。属性扩展控件构建在.Net framwork的属性扩展概念上,实际上ASP.NET自身在运行时并不支持属性扩展组件,所以Atlas提供了一个架构实现了扩展属性的持久化,同时提供了一个designer框架实现了在被扩展控件(如,本例中的TextBox)的属性列表中列出属性扩展组件支持的扩展属性。
    Step 1:定义扩展属性
    实现一个属性扩展组件的第一步就是定义一个继承自TargetControlPeoperties的属性类,该属性类将会保存被扩展对象的相关属性设置。象通常那样,这个属性对象的实例将会保存在页面源码标记中。基础对象中实现了IStateManager,因此向基础的Control类一样包含了处理ViewState管理逻辑。
Step1
    LabelCssClass是属性扩展组件的一个属性,通常所有扩展组件包括一个Enabled的属性。属性扩展组件将应用到页面上具有相同命名空间的全部控件(本例中是全部TextBox)。因此,你需要又一个布尔值的属性以跟踪某个特定的控件是否启用扩展属性。另外,必须实现IsEmpty属性,以便Designer用来判断扩展属性是否为空来决定是否持久化到标记中。
    Step 2:实现属性扩展组件
    下面就是如何在属性扩展控件中使用这个扩展属性对象。
Step2
    典型的Atlas-enabled控件绘制XML-scipt,用来定义和定制绑定的脚本组件。因此,RenderScript是本实现中最令人感兴趣的方法,在这里ScriptTextWriter用来输出XML脚本。在本实现中获取特定被扩展控件的相关扩展属性对象,适当地输出XML标记。
<control id="nameTextBox">
  
<behaviors>
    
<nk:inPlaceEdit
      
labelCssClass="inPlaceEditLabel" labelHoverCssClass="inPlaceEditLabelHover" />
    
</behaviors>
</control>
    一个有趣的问题是属性扩展控件是怎么样向被扩展的控件内部注入脚本标记的?原来是ExtenderControl这个基类在OnPreRender事件中做了一些工作。首先,定位ScriptManager,并且为每一个被扩展的控件调用RegisterControl,以确保一段XML-script标记正确的加入到控件的输出当中(甚至被扩展控件本事不是一个Atlas-enabled控件,也就是没有实现IScriptContrl的控件)。ScriptManager返回每个控件相应的IScriptControl实现,ExtenderControl既而调用RegisterBehavior方法将自身注册为一个behavior,把自身的IScriptBehavior实现传递过去。当被扩展控件输出自身的XML-script的时候,将会调用属性扩展控件的RenderScript方法。
    所有的Atlas组件都在特定的命名空间下面,以避免冲突。XML-script同样具有命名空间的概念。为了使你自己的命名空间在输出的XML-script中注册为一个xmlns,扩展控件的实现中在OnPreRender事件中将会调用ScriptManager的RegisterScriptnamespace方法。
    Step 3:实现设计器
    设计器(designer)是利用了.Net属性扩展者模型。本质上设计器指定控件可以扩展的控件的范围,给出给被扩展者增加的属性。
Step3
    和ExtendControl类似,EntenderControlDesigner也是一个泛型的类,InPlaceEditExtenderDesigner给所有的TextBox控件增加一个“InPlaceEditing”属性,这是通过设置类的ProviderProperty特性来指定的。另外实现了一个扩展属性的读取器函数(getter)。读取器本身指定了要获得属性对象的被扩展的特定TextBox控件。设计器重载了CanExtend方法,限定自己可以扩展的控件范围。非常优美不是吗?Atlas框架实现大量地内部细节。例如:当被扩展对象ID改变或删除的时候自动实现对相应属性对象的管理工作。
    希望本系列文章实现了对Atlas平台延展性的惊鸿一瞥,希望我能看到您开发的一些客户定制组件可控件。:-)

    附记:为了强迫自己踏实的学习一下Atals Behavior编程,特此翻译了此系列文章,由于水平有限,造成了您理解上的混乱还请您多多包涵。:-)
posted @ 2006-04-29 13:39  柒零壹  阅读(547)  评论(4编辑  收藏  举报