程序猿小海棉1
2009-07-18 by 嘉瑜, Category: 码农日记, Tags: 开发点滴 No Comments 4次浏览
读书笔记别人做得更细 …
1. javascript 仿多态方法。 arguements.length. 按入参数量即可
function onsuccessedmethod(result){ if (arguments.length == 1) // 实际传送进来的参数对象集合的长度 { document.getElementById( "span1" ).innerHTML = result; } }
2.ado.net2.0 多出 DBConnection, DBCommand 类。并可用
DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient")
来实现数据库的工厂模式。
3.scriptmanager 一定要有 ID , asmx 里面的 webmethod 不可以是 static ,修改完后需要 compile ,完成后需要保存,不然都不会弹出 ws 类 。 pagemethod 必须是 static.
4. 使用 datetime.utcnow 存储时间 是好习惯(适用于多语言项目) 。
5.intA/intB, 如果 B 为 0 则溢出错,如果 B 为 floatB ,则不会有错。
6.javascript 里面也自带 String.format() 方法 ,使用方法同 C# 。
7. 异常处理的 JS 代码为(设返回的错误对象为 err ) .err.get_timedOut(), err.get_message(), err.get_exceptionType(), err.get_stackTrace().
8. 超时只能在 webservice 服务器方法中设置,也可以用 ws 类 .set_timeout(2000) ,在 JS 中进行设置(暂时不明白)
如果不这么设置,会一直等服务端的 thread.sleep(5000) 。
9. 复杂数据类型使用基础。
(1) 公有属性或公有 Field 会被释放和接受。
(2) 容器对象,实现 IList 接口的对象,实现 IDictionary 接口的对象( Key 必须是 Sstring)
10. 使用 Web Development Helper , enable HTTP Log 。查看 request body. 会发现它遵循一种著名的协议 application/json . 将对象序列化成一个串。比如: {"_employee":{"FirstName":"Elva","LastName":"Shi","Salary":1000,"DateOfPayOff":"\/Date(1244530860343)\/"}}
接下来这个字符串将被反序列化成一个对象到服务器端。
同样从 server 回来时会再次序列化成一个串。
{"d":{"__type":"HomeWeb.Employee","FirstName":"Elva","LastName":"Shi","DateOfPayOff":" \/Date(1244530860343)\/ ","Salary":2000,"FullName":"Elva,Shi"}}
11. 简化 callback 方法:
function reverse(arr) { HomeWeb.ComplexType.Reverse(arr, function (result){ // 偷懒法,开发时不建议这样写,可读性降低。 document.getElementById( "span1" ).innerHTML = result; }};}
12. 客户端代理使用细节:
函数调用完整签名
Invoke(arg1, … ,argN, onSucceeded, onFailed, userContext)
回调函数完整签名
onSucceeded( resu lt , userContext , methodName)
onFailed( error ,userContext,methodName)
WebService 级别默认属性
Timeout
defaultUserContext
defaultSucceededCallback
defaultFailedCallback
(如何在服务器端获取 userContext? )
userContext : 调用 Web Service 时传递的用户上下文对象 . 可以是任何一个对象,多个对象可以用字典
13. 如果没有设置失败回调函数,则使用这个默认。
HomeWeb.WebserviceErrorHandler.set_defaultFailedCallback(failedCallback);
等等。
14.asp.net ajax 和 webservice 。不是利用了 ws 的 xml 什么 soap 什么的,只是利用了 WS 的方便性,使用了 json 协议和反射。
二.参数类型的序列化与反序列化
1. 复杂参数的基本使用方式:
作为参数的类型一定要有默认的构造函数,编译器自动生成默认的构造函数,手动编写默认的构造函数。
客户端设置类型共有的域变量及属性。设置的属性必须有 Setter 方法。
使用 JSON 进行传输格式 。
自动进行序列化及反序列化。
2. 生成复杂参数类型的客户端代理
a) 使用 GenerateScriptTypeAttribute 标记要生成代理的参数类型(输送到客户端去)
b) 可以标记在类,接口以及方法上 (可以标记在类上面)
c) 生成的代理中将包括客户端类型的代理
d) 调用方法时可以创建 ” 具体类型 ” new [namespaces].classname() ;没有其它构造方法(构造函数)
3. 客户端代理的作用 (scripttype)
在对象里做了一个标记 “ __typoe ” = “ ComplexType.Color ”
服务器端根据标记选择反序列化的目标类型
可出“多态”效果
if (typeof(HomeWeb.FulltimeEmployee) === ‘undefined’)
为什么三个等号呢? ( 恒等于,对数据类型也作强制判断 )
parseInt(100,10) ( 使用 十 进制 )
4. 可以使用这种方法来实现多态:
a) // 多态的效果
switch (val) { case "Intern" : emp = new HomeWeb.Intern(); break ; case "Vendor" : emp = new HomeWeb.Vendor(); break ; case "FullTimeEmployee" : emp = new HomeWeb.FulltimeEmployee(); break ; }
b)
< select id ="sel1"> < option value ="HomeWeb.Intern" selected ="selected"> Intern </ option > < option value ="HomeWeb.Vendor"> Vendor </ option > < option value ="HomeWeb.FulltimeEmployee"> FullTime Employee </ option > </ select >
为了生成 {"emp":{"__type":"HomeWeb.FullTimeEmployee","Years":11}} 使用 var emp = new Object(); emp. __type = val; 需要最先来定义,放在第一个(表征类型的代理)
5. 使用 JavaScriptConverter 来返回一个数据类型(如 datatable )
复杂类型作为返回值时可能会出现问题(循环引用 ,如 for 等 )
解决方案(使用自定义数据类型封装复杂类型)(在 web.config 里定义 Converter )
6 .自定义 JavaScriptConverter
1) 用于处理复杂类型(处理循环引用)(简化默认的复杂序列化和反序列化行为)
2) 定义并使用一个 JavaScriptConverter
a) 定义一个 Converter 继承 JavascriptConverter 类
b) 实现 SupportedTypes
c) 实现 Serialize 方法用于序列化复杂数据
d) 实现 Deserialize 方法用于反序列化复杂数据
e) 在 web.config 内注册该 converter
7. 序列化与反序列化能力
a) JavaScriptConverter :自定义序列化与反序列化能力
b) JavaScriptTypeResolver :建立数据类型与标识符的映射
c) 不是真正的 JSON 序列化(时间日期对象)( Sys.Serialization.JavaScriptSerializer )
代码管理器, for ,按 tab 键即可
8. 使用 string.IsNullOrEmpty 方法测试 null 或空字符串 e.g. if(!string.IsNullOrEmpty(str)){…}
Tags: 开发点滴


