
2006年5月23日
目前ASP.NET中的数据绑定是单向的,即允许开发人员将数据模型帮定到页面控件上显示,提交表单的时候,必须再次将页面控件值绑定到数据模型。大家都不太喜欢写这样的代码。
通过自定义特性,Spring.Web提供了控件与数据模型的双向绑定的功能,减少了代码量。
双向绑定使用起来很方便,但页面类需要从Spring.Web.UI.Page类继承。
public class UserRegistration : Spring.Web.UI.Page
{
[Binding("Text", "UserInfo.Email")]
protected TextBox email;
// ……
// 此属性即数据模型
private User m_User;
public User UserInfo
{
get { return m_User; }
set { m_User = value; }
}
}
Binding特性有可选参数OneWay(第三个参数),如果为true,退化为单向绑定,即不再更新模型数据,对只读的数据或者通过计算得到的只读数据特别有用。另一个可选参数为Format,用于指定绑定值的显示格式,通常和OneWay联合使用,提供日期或数值自定义格式,支持String.Format方法支持的格式表达式。
类型转换,绑定时,Spring.Web试图进行数据转换,如果指定Format参数,Spring.Web将使用此参数将数据模型值转为String,否则,使用.NET的类型转换机制。
数据绑定事件,Spring.Web的页面基类在.NET页面的生命周期加入两个事件:DataBound和DataUnbound。DataBound事件在控件值被更新后激发,在PreRender事件之前。事件发生顺序为:Load――>DataBound――>PreRender,这样是合适的,在Load事件处理代码中对数据模型做出修改,能反映在控件上。DataUnbound事件在数据模型被更新后激发,在Load事件之后,此时是回发。
参考:spring-net-reference.pdf。
很遗憾,使用Spring.NET 1.1 Preview 2没有测试成功,。我会继续跟踪,新版本或许能解决问题。
posted @ 2006-05-23 14:09 快乐尘埃 阅读(875) 评论(0)
编辑
NAnt 是一个Visual Studio .Net应用程序的连编工具,对大而负责的工程而言,使用NAnt很方便。
1. 安装
从http://nant.sourceforge.net上可以下载源代码或者编译好的二进制文件,一般下载nant-bin.zip,解压,注册系统环境变量后,就可以使用nant命令了。
2. Build文件
XML格式,每个build文件包含一个project,project有若干target,每个target包含若干task。Task不被包含在target中,即直接包含在project中。
Ø Projects(工程)
三个特性,name、设置工程名称,default、设置默认target,和basedir、如果不设置,默认为build文件的父目录。
执行nant时,可以知道targets,如果未指定,执行默认得target,如果build文件中未指定默认得target,仅仅执行全局的task(全局的task总是执行),如果没有全局的task,那就什么都不执行了。
Ø Targets(目标、对象)
有五个特性,name、指定名称,depends、此target所依赖的targets(多个用“,”隔开),if、如果条件为true执行此target,unless、如果条件为true跳过此target,description、功能的简短描述。其中name必须指定。
执行某个target时,首先执行此target所依赖的targets。一个target可能被depends多次,仅执行一次,但是通过<call>任务(task)执行一个target时,此target及其所依赖的targets要重新执行一次。另外,当target的名称被设置为“*”时,称为wild target,一个build文件仅仅有一个wild target,在目前的build文件中,当且仅当被调用的target不存在时,才执行wild target,主要用来处理无效的请求。
Ø Task(任务)
一块可执行的代码,一个task可有多个特性和参数。特性的值可包含对属性的引用,在task执行前,这些引用会被解释出来。
Ø Properties(属性)
一个project可有很多属性,这些属性可以通过<property任务设置在build文件中,也可以设置在Nant外。一个属性有一个name和一个value,可用于task的特性中,也可用于表达式,用在task的特性中时,使用${property name}格式。Nant有很多内建属性(与nant有关的,与框架有关的,与平台有关的等)。
<property>任务有readonly和overwrite等特性,readonly指定属性是否是只读到,默认false,overwirte指定如果属性已经存在,属性值是否可以重写,默认true,对于只读属性,是不能被重写的。注意:在Nant命令行指定的属性,先于在build文件中指定的属性,并且这些属性往往是只读的。
另外可以在NAnt.exe.config文件中定义全局属性。
Ø Loggers & Listeners
Nant 通过Loggers和Listeners来监控连编过程。Listeners记录了build started,build finished,target started,target finished,task started,task finished,message logged事件,Loggers扩展了Listeners,可以按-quiet(静态的,平稳的), -verbose(详细的), -debug三个层次记录连编信息,可输出到控制台或者文件中。Nant内建了三个类:NAnt.Core.DefaultLogger、NAnt.Core.MailLogger和NAnt.Core.XmlLogger。使用时:-logger:类 -logfile:文件名。可以是普通道文本文件或者XML文件。
Ø Expressions(表达式)
表达式是一种简单而强大的机制,允许写高级的公式,用于task的参数和条件式中,这样就可以控制连编过程了。表达式能够访问project的属性、调用内建的或者用户定义的functions。
表达式通过${…}符号,可用于task的参数中。也可以使用标准的算术、逻辑和关系运算符。通过prefix::function-name(argument1, ..., argumentN)语法调用函数。访问属性,仅需指定其name(${…})
例子:
访问属性
<property name="build.version" value="3" />
<echo message="The current date is: ${build.version}" />
调用函数
<echo message="The current date is: ${datetime::now()}" />
表达式结果存储
<property name="autoexec-present" value="${file::exists('c:\autoexec.bat')}" />
Real-life expression use
<property name="myprj.basedir" value="c:\" />
<property name="filename" value="${path::combine(myprj.basedir,'version.txt')}" />
<if test="${not file::exists(filename) or file::get-length(filename) = 0}">
<echo message="The version file ${filename} doesn't exist or is empty!" />
</if>
有条件执行task
<property name="myprj.basedir" value="c:\" unless="property::exists('myprj.basedir')" />
<csc target="library" output="out.dll" ...
if="${datetime::now() - file::get-last-write-time('out.dll')) > timespan::from-hours(1)}">
...
</csc>
Functions
Nant提供了操作字符串、日期时间和路径名字的函数,还提供读取文件或者目录属性,访问目前的连编信息等函数。
调用函数语法prefix::function-name(argument1, ..., argumentN),需要的情况下会进行参数类型转换,如果转换有误,会报告错误。
自定义函数可以使用任何.Net语言实现,此外还可以通过<script>任务实现。
3. 运行Nant
命令Nant,此外还可以指定build文件名、targets和properties等。
Nant
NAnt -buildfile:..\fileName.build
NAnt clean
NAnt -D:debug=false clean dist
posted @ 2006-05-23 08:48 快乐尘埃 阅读(1790) 评论(2)
编辑