<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_老杨随笔-重用与重构的艺术</title><subtitle type="text">专注于RIA架构设计,无止境的重构,无限制的重用</subtitle><id>http://feed.cnblogs.com/blog/u/19781/rss</id><updated>2011-09-30T03:43:44Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/19781/rss"/><entry><id>http://www.cnblogs.com/crabo/archive/2011/09/30/crabo_Dappers2.html</id><title type="text">Dappers : 基于Dapper.net 扩展的Dao - Part II</title><summary type="text">用习惯Linq2Sql的盆友肯定对 from... where....select 这种inline式,强类型的 写法大爱不已.可惜我不是,对于表关联, 这种写法及其最终sql 分析都非常 egg疼, 于是乎Dapper作者博客里就有不少将原Linq2sql 转 sql dapper的心得.但是,我完全同意: 在一般简单查询,Lambda写起来更顺手,更美观,更强类型. (Lambda解析转SQL语句,请看这里)所以我的Dappers 里 又加了个接口. 所有这些,都是面向sql, 面向跨oracle / sql server 的. 1. 如果彻底不写SQL, 数据库的基本信息还是需要的[Sy</summary><published>2011-09-30T03:32:00Z</published><updated>2011-09-30T03:32:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2011/09/30/crabo_Dappers2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2011/09/30/crabo_Dappers2.html"/><content type="html">&lt;div&gt;用习惯Linq2Sql的盆友肯定对 from... where....select 这种inline式,强类型的 写法大爱不已.&lt;/div&gt;&lt;p&gt;可惜我不是,对于表关联, 这种写法及其最终sql 分析都非常 egg疼, 于是乎Dapper作者博客里就有不少将原Linq2sql 转 sql dapper的心得.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;但是,我完全同意: 在一般简单查询,Lambda写起来更顺手,更美观,更强类型. (Lambda解析转SQL语句,&lt;a href="http://www.codeproject.com/KB/dotnet/linqToSql5.aspx"&gt;请看这里&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;所以我的Dappers 里 又加了个接口. 所有这些,都是面向sql, 面向跨oracle / sql server 的. &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1. 如果彻底不写SQL, 数据库的基本信息还是需要的&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;[System.Data.Linq.Mapping.Table(Name&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SYS_OFFICE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;MyOffice&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.Data.Linq.Mapping.Column(Name&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;OfficeId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;IsPrimaryKey&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;Id&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;Name&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;OfficeType&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;......&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2.&amp;nbsp;Query&amp;lt;T&amp;gt;(whereExpression)&lt;/p&gt;&lt;p&gt;&lt;font  face="'Courier New'" size="2"&gt;&lt;span  style="line-height: 19px;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;font  face="'Courier New'" size="2"&gt;var&amp;nbsp;user&amp;nbsp;=&amp;nbsp;dao.Query&amp;lt;MyUser&amp;gt;(u&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;nbsp;u.UserCode.StartsWith(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;chen&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));//此时用到上述mapping,否则无需描述mapping&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;user1&amp;nbsp;=&amp;nbsp;dao.Query&amp;lt;MyUser,MyOffice&amp;gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select&amp;nbsp;t.*&amp;nbsp;from&amp;nbsp;SYS_USER&amp;nbsp;t&amp;nbsp;inner&amp;nbsp;join&amp;nbsp;SYS_Office&amp;nbsp;t1&amp;nbsp;on&amp;nbsp;t.OfficeId=t1.Id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;(u,o)&amp;nbsp;=&amp;gt;&amp;nbsp;u.UserCode.StartsWith(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;chen&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;o.Name.Contains(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;办公室&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;user2&amp;nbsp;=&amp;nbsp;dao.Query&amp;lt;IDictionary,MyUser,&amp;nbsp;MyOffice&amp;gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select&amp;nbsp;t1.UserCode,t1.Name&amp;nbsp;from&amp;nbsp;SYS_USER&amp;nbsp;t1&amp;nbsp;inner&amp;nbsp;join&amp;nbsp;SYS_Office&amp;nbsp;t2&amp;nbsp;on&amp;nbsp;t1.OfficeId=t2.Id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;(d,u,&amp;nbsp;o)&amp;nbsp;=&amp;gt;&amp;nbsp;u.UserCode.StartsWith(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;chen&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;o.Name.Length&amp;gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;);&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3.UnitTest result&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/crabo/110928nuint.JPG" width="752" height="485" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/crabo/aggbug/2196294.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2011/09/30/crabo_Dappers2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2011/09/28/crabo_Dappers.html</id><title type="text">Dappers : 基于Dapper.net 扩展的Dao</title><summary type="text">某天在园里看到Dapper.net , 终于发现找到我一致梦寐的 OM (Object Mapping) (某人,你知道的....).从Java到.Net , 从spring.net 0.6 到 spring.net 1.3.2 , 一直在使用Hibernate, 但这个 ORM - Relation 处理却一直被我唾弃. 如今终于如愿以偿, 立即开始对它进行简单的封装.功能扩展: 1.ValueType类型隐式转换, 如某一个numeric 在Oracle中是Int64,但Sql Server中确是 decimal, 需要在DynamicMethod中加入隐式转换. 2.Clob大字段支持.</summary><published>2011-09-28T00:52:00Z</published><updated>2011-09-28T00:52:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2011/09/28/crabo_Dappers.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2011/09/28/crabo_Dappers.html"/><content type="html">&lt;div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 某天在园里看到&lt;a href="http://code.google.com/p/dapper-dot-net/"&gt;Dapper.net&lt;/a&gt; , 终于发现找到我一致梦寐的 OM (Object Mapping)&amp;nbsp; (某人,你知道的....).&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;从Java到.Net , 从spring.net 0.6 到 spring.net 1.3.2 , 一直在使用Hibernate, 但这个 ORM - Relation 处理却一直被我唾弃.&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如今终于如愿以偿, 立即开始对它进行简单的封装.&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;功能扩展:&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.ValueType类型隐式转换, 如某一个numeric 在Oracle中是Int64,但Sql Server中确是 decimal, 需要在DynamicMethod中加入隐式转换.&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.Clob大字段支持. &amp;nbsp;靠Dapper的 XML类型是不行的.&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.参数,结果集 弱类型转换,如 IDictionary 作为请求参数 或DTO&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.增加非泛型接口查询&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.存储过程返回结果集时,处理输出参数 (Oracle Cursor处理及output参数读取)&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.简单sql,自动组装分页语句处理 (top order,rownum, skip/take)&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7.根据DbProvider自动替换参数prefix&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8. 实现SQL,SP调用完全透明兼容Oracle/SQL Server&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9. 对象转SQL CRUD语句,以及 partial update 语句自动生成.&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10. 支持OSIV模式的Connection以及Transaction管理 (模仿Spring.Net SessionScope)&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;-----------&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Delete&amp;nbsp;a&amp;nbsp;user&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MyUser&amp;nbsp;u&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;MyUser()&amp;nbsp;{&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;testId&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dao.Execute(QueryInfo.GetSQLUpdate(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(MyUser)),u);&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;SP返回2个结果集10行&amp;nbsp;Users,Offices,同时返回两表总函数&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueryInfo&amp;nbsp;info&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;QueryInfo();&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.NamedQuery&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;TEST_DAPPER_USERS&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.AddParam(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;UserCode&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;y%&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.AddParam(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;out_TotalCount&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.AddParam(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;out_TotalCount2&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.AddParam(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;out_cursor1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CURSOR&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.AddParam(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;out_cursor2&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CURSOR&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;dao.QueryMultiple(info);&lt;br /&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;user&amp;nbsp;=&amp;nbsp;reader.Read&amp;lt;MyUser&amp;gt;();&lt;br /&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;office&amp;nbsp;=&amp;nbsp;reader.Read&amp;lt;MyOffice&amp;gt;();&lt;br /&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;reader.OutputParams[&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;out_TotalCount&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;j&amp;nbsp;=&amp;nbsp;reader.OutputParams[&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;out_TotalCount2&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;IDictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;nbsp;param&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param.Add(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;UserCode_RLK&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;chen&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;==&amp;gt;&amp;nbsp;and&amp;nbsp;UserCode&amp;nbsp;like&amp;nbsp;:UserCode&amp;nbsp;&amp;nbsp;/'chen%'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param.Add(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CreatedOn_GEQ&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;2011-09-01&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;==&amp;gt;&amp;nbsp;and&amp;nbsp;CreatedOn&amp;nbsp;&amp;gt;=:CreatedOn&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param.Add(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;IsActive&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;);&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;==&amp;gt;&amp;nbsp;and&amp;nbsp;IsActive=:IsActive&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueryInfo&amp;nbsp;info&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;QueryInfo(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;SYS_USER&amp;nbsp;u&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.OrderBy.Add(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.AddParam(param);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.TotalCount&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;1&lt;/span&gt;;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;分页请求&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.PageSize&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;15&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.StartRecord&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080"&gt;10&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info.MappingType=&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(MyUser);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;dao.Query(info);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;info.List=IList[10]&amp;nbsp;Results&amp;nbsp;of(MyUser)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;info.TotalCount=&amp;nbsp;counts&amp;nbsp;of&amp;nbsp;the&amp;nbsp;table&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;------------&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dapper实现非常不错,但结合我的应用场景有些缺陷, 而且静态方法实现导致扩展代码难免侵入,&lt;/div&gt;&#xD;
&lt;div&gt;可能造成后期Dapper同步升级一些隐患. 目前靠10个 NUnit用例保障.&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有兴趣用Dapper的朋友,对扩展,应用有什么疑问我乐于帮忙~~&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/crabo/aggbug/2193774.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2011/09/28/crabo_Dappers.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/09/13/1825189.html</id><title type="text">B/S页面 通用权限控制(2)</title><summary type="text">恰逢公司网络故障， JIRA、SVN、ORACLE都无法连接上，那就继续上次的议题吧。 实现原理深入： 目标：查看所有招标合同， select * from Documents 权限约束场景： &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; A. 每个用户仅可查看本部门创建的合同： where CreatedOffice in ( CurrentUser.ChildrenOffice...</summary><published>2010-09-13T10:00:00Z</published><updated>2010-09-13T10:00:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/09/13/1825189.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/09/13/1825189.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;恰逢公司网络故障， JIRA、SVN、ORACLE都无法连接上，那就继续上次的议题吧。&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;实现原理深入：&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;目标：查看所有招标合同， select * from Documents&lt;/li&gt;      &lt;li&gt;权限约束场景： &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; A. 每个用户仅可查看本部门创建的合同： where CreatedOffice in ( CurrentUser.ChildrenOffices)&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B. 每个用户仅可查看自己创建的合同：&amp;#160;&amp;#160;&amp;#160; where CreatedBy=CurrentUser.UserId&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C.指定权限用户可以查看关联的合同：&amp;#160;&amp;#160;&amp;#160; （需要通过Alt+双击，定义所有的合同权限，否则默认为All可见）&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where DocumentId in (select ResourceId in AclParty p where p.PartyId in &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ( CurrentUser.Offices, CurrentUser.UserId, CurrentUser.Roles, CurrentUser.Groups )&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ) OR DocumentId NOT IN (select ResourceId in AclParty p )&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 查看此用户/部门/角色/工作组拥有的合同， 以及未作授权的合同可见。&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; D. 上述权限的组合&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where CreatedOffice in (CurrentUser.ChildrenOffices) and DocumentId in (Resource &amp;#8230; in &amp;#8230;.AclParty &amp;#8230;of &amp;#8230;.CurrentUser&amp;#8230;)&lt;/p&gt;    &lt;p&gt;3.&amp;#160; 实施约束：&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; QueryInfo info = new QueryInfo(&amp;#8220;Documents d&amp;#8221;);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //IList allDocs = Dao.FindList(info);&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 仅需设置如下属性， 则上述约束的sql会自动注入到查询条件后。&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; A. info.AclProperty=&amp;#8221;d.CreatedOffice&amp;#8221;;&amp;#160;&amp;#160; (常量检测CreatedOffice)&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B. info.AclProperty=&amp;#8221;d.CreatedBy&amp;#8221;;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (常量检测CreatedBy)&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C. info.AclProperty=&amp;#8221;d.Id&amp;#8221;;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; D.&amp;#160; info.AclProperty=&amp;#8221;d.Id,d.CreatedOffice&amp;#8221;;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font color="#000000"&gt;扩展应用：&lt;/font&gt;&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;font color="#000000"&gt;检测用户对某一资源的控制串：&lt;/font&gt;&lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; A. bool&amp;#160; hasPurview = CurrentUser.GetAclOperation(&amp;#8220;ResourceId&amp;#8221;,&amp;quot;OperationCode&amp;#8221;);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; B. btn_Del_.Visible&amp;#160; = CurrentUser.GetAclOperation(&amp;#8220;DocumentId001&amp;#8221;,&amp;quot;Del&amp;#8221;);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C. 对于同一资源Id， 一次取出此用户对应的所有OperationCode。&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;2.&amp;#160;&amp;#160; 验证用户对某一资源的操作&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; QueryInfo info = new QueryInfo(&amp;#8220;Delete from Documents d&amp;#8221;);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.AddParam(&amp;#8220;OfficeId&amp;#8221;, CurrentUser.Office);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.AclProperty=&amp;#8220;d.Id&amp;#8221;;&amp;#160;&amp;#160; ///等同于 info.Where.Add(&amp;#8220;Id&amp;#8221;,&amp;quot;DocumentId in (Resuource &amp;#8230;in &amp;#8230;.AclParty &amp;#8230;of &amp;#8230;.CurrentUser&amp;#8230;)&amp;quot;);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dao.ExecuteUpdate(info);&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 上述操作即可完成： 删除所有&amp;#160; 本人拥有权限的、且属于本部门的合同。&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;强制数据权限：&lt;/p&gt;    &lt;p&gt;1.QueryInfo无需定义任何AclProperty&lt;/p&gt;    &lt;p&gt;2. 通过AOP，在Dao拦截所有QueryInfo&lt;/p&gt;    &lt;p&gt;3. 逐一检验QueryInfo的QueryObject， 与AclItem 中的所有Module=QueryObject 的项目比较， 如果&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; info.QueryObject in (AclItem.ResourceCode)&amp;#160; and&amp;#160; info.GetOperationCode() == AclItem.OperationCode,&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 则 info.AclProperty=AclItem.Policy;&lt;/p&gt;    &lt;p&gt;4. 自动激发AclProperty校验。&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font color="#000000"&gt;总结：&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160; 通过上述步骤， 对数据项进行人工控制、自动注入都是非常方便的。 其控制粒度就是对象的属性。 根据属性在&amp;#160; 资源-授权组 的设定， 即可有效的进行数据权限&amp;#160; 判断、控制、校验。&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; 但目前对&amp;#160; 同一对象 多个属性 叠加 校验时， 叠加策略如何灵活定义(AND, OR) ?? &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160; 如： 查看&amp;#160; 经过总经理审批的&amp;#160; AND&amp;#160; 我创建的&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 查看 经过总经理审批的&amp;#160;&amp;#160;&amp;#160; OR&amp;#160;&amp;#160; 我创建的&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;AclProperty如何扩充足够的语义，以完成完整的Policy设定？ 欢迎大家讨论！！&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;img src="http://www.cnblogs.com/crabo/aggbug/1825189.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/09/13/1825189.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/09/10/1823529.html</id><title type="text">B/S页面 通用数据权限控制</title><summary type="text">&amp;#160;&amp;#160;&amp;#160; 数据权限常见场景有： 数据仅部门级可见 数据仅本人可见 数据仅某角色可见 在可见的基础上，进行功能控制： 修改，删除 在树形结构里，在可见基础上进行 新增/修改/删除控制 我的实现方式： 资源---所有者&amp;#160;&amp;#160; （请思考哪些可以是资源， 哪些可以是所有者）。 例如：在一个OA应用中的拟办工作，它是所有单证流程的起始点。但不同的流程面，有效的发...</summary><published>2010-09-10T10:04:00Z</published><updated>2010-09-10T10:04:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/09/10/1823529.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/09/10/1823529.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 数据权限常见场景有：&lt;/p&gt; &lt;/blockquote&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;数据仅部门级可见 &lt;/li&gt;      &lt;li&gt;数据仅本人可见 &lt;/li&gt;      &lt;li&gt;数据仅某角色可见 &lt;/li&gt;      &lt;li&gt;在可见的基础上，进行功能控制： 修改，删除 &lt;/li&gt;      &lt;li&gt;在树形结构里，在可见基础上进行 新增/修改/删除控制 &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;我的实现方式： 资源---所有者&amp;#160;&amp;#160; （请思考哪些可以是资源， 哪些可以是所有者）。 例如：在一个OA应用中的拟办工作，它是所有单证流程的起始点。但不同的流程面，有效的发起人是必须限定的：请假单--全体人员； 收文发文--办公室人员；会议室申请单--项目经理；下面我将实现的是：所有的单证都从属于类别，所有属于&amp;#8220;OA单证&amp;#8221;，仅&amp;#8220;办公室&amp;#8221;人员可以拟定。&lt;/p&gt;    &lt;ol&gt;&lt;/ol&gt; &lt;/blockquote&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;确定资源定义位置。&amp;#160; 如用户，则用户维护页是该资源的位置，资源的Id就是UserId。 这里进入&amp;#8220;表单类别设定页面&amp;#8221;。 &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&amp;#160; &lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/001.png"&gt;&lt;img title="001" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="298" alt="001" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/001_thumb.png" width="577" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;按住Alt+双击 页面空白处，弹出资源授权页，选择操作为&amp;#8220;查看&amp;#8221;。实际上，任何拥有&amp;#8220;修改&amp;#8221;的人，都拥有查看权限，同理： 查看&amp;lt;修改&amp;lt;创建&amp;lt;删除.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/002_2.jpg"&gt;&lt;img title="002" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="359" alt="002" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/002_thumb_2.jpg" width="591" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2. 为指定资源设置&amp;#8220;所有者&amp;#8221;。 所有者类型可以有： 部门/人员/工作组/角色组&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/003_1.jpg"&gt;&lt;img title="003" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="352" alt="003" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/003_thumb_1.jpg" width="580" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160; 3. 保存设置。 这样就配置了仅&amp;#8220;办公室&amp;#8221;&amp;#8220;陈伟&amp;#8221;能拟定&amp;#8220;OA表单&amp;#8221;了。&lt;/p&gt;  &lt;p&gt;&amp;#160; 4.现在进入&amp;#8220;拟办工作页面&amp;#8221;。 此时权限尚未启用。 （哪些点可以进行权限控制？ Request—&amp;gt;Service—&amp;gt;Dao—&amp;gt;Db&amp;#160; 已及反方向)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/004.jpg"&gt;&lt;img title="004" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="004" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/004_thumb.jpg" width="579" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;5. 在拟办工作页面， 生成树形节点， 查询节点中，加入c.Id 控制。&amp;#160; 这就意味着， 输出列表时，会检验每一个&amp;#8220;类别&amp;#8221;，判断当前用户是否属于授权的&amp;#8220;部门/用户/工作组&amp;#8221;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/005.jpg"&gt;&lt;img title="005" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="155" alt="005" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/005_thumb.jpg" width="430" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;6. 用财务部人员登录系统，类别&amp;#8220;OA单证&amp;#8221;已经消失了。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/006.jpg"&gt;&lt;img title="006" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="174" alt="006" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/006_thumb.jpg" width="458" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;7.以上Magic仅仅是QueryInfo在提交NHibernate之前的一个小动作，调用AclHQLInjector而已。 目前的触发条件是AclProperty。 对于大量数据权限定义的情况， 完全可以将Inject条件在数据库中定义。 QueryInfo默认触发检验即可。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;8. 最后可见 数据权限设置表 的简单结构：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/007.jpg"&gt;&lt;img title="007" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="382" alt="007" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/BS_F6CC/007_thumb.jpg" width="320" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/crabo/aggbug/1823529.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/09/10/1823529.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/07/02/BtsActionMapping_MisMatch.html</id><title type="text">由于ContractFilter在EndpointDispatcher不匹配，因此Action为&amp;lt;BtsActionMapping...的消息无法在接收方处理</title><summary type="text">BizTalk配置WCF调用发生异常：由于 ContractFilter 在 EndpointDispatcher 不匹配，因此 Action 为&amp;#8220;&amp;amp;lt;BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSche...</summary><published>2010-07-02T08:11:00Z</published><updated>2010-07-02T08:11:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/07/02/BtsActionMapping_MisMatch.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/07/02/BtsActionMapping_MisMatch.html"/><content type="html">&lt;p&gt;BizTalk配置WCF调用发生异常：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;由于&amp;nbsp; ContractFilter 在 EndpointDispatcher 不匹配，&lt;br /&gt;因此 Action 为&amp;#8220;&amp;amp;lt;BtsActionMapping xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance" target="_blank"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;" &lt;br /&gt;xmlns:xsd="&lt;a href="http://www.w3.org/2001/XMLSchema%22&amp;amp;gt" target="_blank"&gt;http://www.w3.org/2001/XMLSchema%22&amp;amp;gt&lt;/a&gt;;&lt;br /&gt;&amp;nbsp; &amp;amp;lt;Operation Name="SendEventInfo" Action="&lt;a href="http://tempuri.org/IDataExChangeService/SendEventInfo" target="_blank"&gt;http://tempuri.org/IDataExChangeService/SendEventInfo&lt;/a&gt;" /&amp;amp;gt;&lt;br /&gt;&amp;nbsp; &amp;amp;lt;Operation Name="ReceiveEventInfo" Action="&lt;a href="http://tempuri.org/IDataExChangeService/ReceiveEventInfo" target="_blank"&gt;http://tempuri.org/IDataExChangeService/ReceiveEventInfo&lt;/a&gt;" /&amp;amp;gt;&lt;br /&gt;&amp;nbsp; &amp;amp;lt;Operation Name="ReceiveRejectEventInfo" Action="&lt;a href="http://tempuri.org/IDataExChangeService/ReceiveRejectEventInfo" target="_blank"&gt;http://tempuri.org/IDataExChangeService/ReceiveRejectEventInfo&lt;/a&gt;" /&amp;amp;gt;&lt;br /&gt;&amp;amp;lt;/BtsActionMapping&amp;amp;gt;&amp;#8221;的消息无法在接收方处理。这可能是由于协定不匹配(发送方和接收方 Action 不匹配)&lt;br /&gt;或发送方和接收方绑定/安全不匹配。请检查发送方和接收方是否具有相同的协定和绑定&lt;br /&gt;(包括安全要求，如 Message、Transport、None.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;解决方案：&lt;/p&gt;&#xD;
&lt;p&gt;1.确认配置的消息安全一致， 如我都设为 None&lt;/p&gt;&#xD;
&lt;p&gt;2.确认每一个Operation Name="SendEventInfo"， 与当前服务的方法名完全相同。 以及Action的Url值。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在我的错误中， 就是Operation Name="SendEventInfo"==&amp;gt; Operation Name="SaveSendEventInfo"就可以了。&lt;/p&gt; &lt;img src="http://www.cnblogs.com/crabo/aggbug/1770043.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/07/02/BtsActionMapping_MisMatch.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/06/29/1767345.html</id><title type="text">WinForm DataGridView 绑定后仅显示许多空行和空格</title><summary type="text">显示的是一个半绑定状态： 行数已经正确了， 数据却不存在？没有异常，没有提示！ 解决方法： 确认所有绑定的字段DataPropertyName里指定的属性， 在类中都指定为Public 。</summary><published>2010-06-29T02:52:00Z</published><updated>2010-06-29T02:52:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/06/29/1767345.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/06/29/1767345.html"/><content type="html">&lt;p&gt;显示的是一个半绑定状态： 行数已经正确了， 数据却不存在？没有异常，没有提示！&lt;/p&gt;&#xD;
&lt;p&gt;解决方法： 确认所有绑定的字段DataPropertyName里指定的属性， 在类中都指定为Public 。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/crabo/aggbug/1767345.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/06/29/1767345.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/06/03/1750845.html</id><title type="text">IIS7下配置WCF的netTcpBinding</title><summary type="text">看起来很小的事情，居然还是废了我半个下午，把我彻底给郁闷了。 无论异常如何，就看看最终成果吧： 1. 先配置Client Bindings, 注意security mode=”None”. 方便切换，...</summary><published>2010-06-03T08:07:00Z</published><updated>2010-06-03T08:07:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/06/03/1750845.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/06/03/1750845.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font color="#000000"&gt;看起来很小的事情，居然还是废了我半个下午，把我彻底给郁闷了。 无论异常如何，就看看最终成果吧：&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;1. 先配置Client Bindings, 注意security mode=&amp;#8221;None&amp;#8221;. 方便切换， 我同时提供了两种Binding&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="219" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb.png" width="677" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;2.配置Server Bindings. 注意PortSharing和SecurityMode&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_4.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="325" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb_1.png" width="681" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;3. 现在要配置服务器了。&lt;/p&gt;    &lt;p&gt;1.打开&amp;#8220;服务管理器&amp;#8221; &amp;#8220;功能&amp;#8221;选项，确认功能 &amp;#8220;WCF激活&amp;#8221;/&amp;#8220;非HTTP激活&amp;#8221;已经安装。&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_6.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="231" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb_2.png" width="220" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;2.右键单击网站，选择&amp;#8220;编辑绑定&amp;#8221;，为WCF Host 站点添加绑定，比如用默认端口808： net.tcp&amp;#160;&amp;#160;&amp;#160; 808:* &lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_8.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="202" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb_3.png" width="403" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;3. 右键单击 网站 以及 应用，分别选择&amp;#8220;高级设置&amp;#8221;, 在&amp;#8220;已启用的协议&amp;#8221;后直接输入net.tcp 。 注意前后都不要有空格。&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_10.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="238" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb_4.png" width="402" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;4. * 顺便重启一下IIS吧。 &lt;/p&gt;    &lt;p&gt;到这里服务器设置完成。&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;4.配置服务端 EndPoints。 无需设置BaseAddress和Address， 直接留空即可。&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_12.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="238" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb_5.png" width="664" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;5. 在浏览器中 测试 &lt;a href="http://your-server/**Service/****.svc"&gt;http://your-server/**Service/****.svc&lt;/a&gt; 。 应该看到服务已经正常发布。&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;6.配置客户端EndPoints。 address里无需指定端口，只需制定协议为net.tcp。 bingding替换为netTcpBinding.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_14.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="119" alt="image" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IIS7WCFnetTcpBinding_E2DB/image_thumb_6.png" width="819" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;7.OK，所有配置完成。&lt;/p&gt;    &lt;p&gt;通过上述配置，我们可以很方便的在http和tcp Bingding中切换：&lt;/p&gt;    &lt;p&gt;服务端EndPoint 替换 binding=&amp;#8221;*****&amp;quot;&lt;/p&gt;    &lt;p&gt;客户端EndPoint替换 binding=&amp;#8221;*****&amp;quot; 以及 address=&amp;#8221;http/tcp.net &amp;#8220; &lt;/p&gt;&lt;/blockquote&gt;  &lt;img src="http://www.cnblogs.com/crabo/aggbug/1750845.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/06/03/1750845.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/05/27/online_master_detail_dev.html</id><title type="text">IPad上做开发——在线B/S开发主从表</title><summary type="text">既然已经实现了在线表单，又实现在线列表， 将列表嵌入表单，即可实现&amp;#8220;Master-Detail&amp;#8221;风格的表单。  上篇说过，表单是继续模板的，所有的界面都基于目标，我只需在模板后台cs注入Grid载入即可。 A.默认表单路径为：/Forms/ProjectDoc.aspx B.主从表单路径为：/Forms/ProjectDoc.aspx?Grid=ProjDocs C. 模板...</summary><published>2010-05-27T08:51:00Z</published><updated>2010-05-27T08:51:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_master_detail_dev.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_master_detail_dev.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;既然已经实现了在线表单，又实现在线列表， 将列表嵌入表单，即可实现&amp;#8220;Master-Detail&amp;#8221;风格的表单。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_EAF9/masterDetail01_2.png" target="_blank"&gt;&lt;img title="masterDetail01" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="363" alt="masterDetail01" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_EAF9/masterDetail01_thumb.png" width="735" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;/blockquote&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;上篇说过，表单是继续模板的，所有的界面都基于目标，我只需在模板后台cs注入Grid载入即可。&lt;/p&gt;&#xD;
&lt;p&gt;A.默认表单路径为：/Forms/ProjectDoc.aspx&lt;/p&gt;&#xD;
&lt;p&gt;B.主从表单路径为：/Forms/ProjectDoc.aspx?Grid=ProjDocs&lt;/p&gt;&#xD;
&lt;p&gt;C. 模板后台cs中Page_Load判断是否Grid参数，存在则往页面注入Grid展示脚本 (参阅通用列表设计)。&lt;/p&gt;&#xD;
&lt;p&gt;D.在/Forms/ProjectDoc.aspx脚本中，增加链接指向： 行头创建新文档， 标题更新文档。&lt;/p&gt;&#xD;
&lt;p&gt;如此，&lt;span style="font-color: red"&gt;开发人员开发主从应用， 只需完成&amp;#8220;D&amp;#8221; &lt;/span&gt;：指定 子表链接 脚本， 而无需进行任何开发。&lt;/p&gt;&#xD;
&lt;p&gt;主从开发可以是完全独立的两件事。&lt;/p&gt;&#xD;
&lt;/blockquote&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;编辑子表时如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_EAF9/masterDetail02_2.png" target="_blank"&gt;&lt;img title="masterDetail02" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="361" alt="masterDetail02" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_EAF9/masterDetail02_thumb.png" width="724" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;此系列文章：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/05/14/1735598.html" target="_blank"&gt;IPad上做开发&amp;#8212;&amp;#8212;在线B/S开发用户定制型通用列表&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_develop_form.html" target="_blank"&gt;IPad上做开发&amp;#8212;&amp;#8212;在线B/S开发表单&lt;/a&gt;&lt;/p&gt;   &lt;img src="http://www.cnblogs.com/crabo/aggbug/1745564.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_master_detail_dev.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/05/27/online_develop_form.html</id><title type="text">IPad上做开发——在线B/S开发表单</title><summary type="text">上一篇介绍过了通用列表的实现及效果。 而他的本质也是&amp;#8220;在线开发&amp;#8221;，包括：开发人员在线开发列表，用户在线定制列表。也可以说是让用户参与了开发。今天要介绍的是基于模板的&amp;#8220;表单&amp;#8221;开发。 表单的概念可以很广，但我这里仅是基于业务场景抽象后提炼模板，有多少模板，就可以实现多少类表单。 请看下图：  树形结构即服务器的物理结构。 根路径可配置，且须配置根路径的A...</summary><published>2010-05-27T07:31:00Z</published><updated>2010-05-27T07:31:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_develop_form.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_develop_form.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;上一篇介绍过了通用列表的实现及效果。 而他的本质也是&amp;#8220;在线开发&amp;#8221;，包括：开发人员在线开发列表，用户在线定制列表。也可以说是让用户参与了开发。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;今天要介绍的是基于模板的&amp;#8220;表单&amp;#8221;开发。 表单的概念可以很广，但我这里仅是基于业务场景抽象后提炼模板，有多少模板，就可以实现多少类表单。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;ol&gt;&#xD;
     &lt;li&gt;&lt;font color="#000000"&gt;请看下图： &lt;/font&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 树形结构即服务器的物理结构。 根路径可配置，且须配置根路径的ASP.NET用户完全控制权限。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 新增、保存、删除都是针对物理文件、物理文件夹操作。继续安全性，所有修改、删除操作的日志、内容都会记录在数据库。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 此界面针对开发人员。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 表单维护有3种途径： &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A.上传、下载增加、替换文件。&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B.创建、修改文件，并用文本框编辑。 &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C.可是编辑器拖拉试设计界面。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/selectFile_2.png" target="_blank"&gt;&lt;img title="selectFile" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="499" alt="selectFile" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/selectFile_thumb.png" width="766" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;2. 文本编辑： 点击&amp;#8220;显示内容&amp;#8221;后，文件内容可直接更改：包括样式、控件、脚本。 &lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp; 同步流程 可以快速建立表单、流程配置的基本信息，方便&amp;#8220;预览&amp;#8221;后直接测试。&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/openFile_2.png" target="_blank"&gt;&lt;img title="openFile" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="476" alt="openFile" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/openFile_thumb.png" width="773" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;3. 可视化设计： &lt;/p&gt;&#xD;
&lt;p&gt;界面上拖拽控件， 更新控件ID、控件样式。 &lt;/p&gt;&#xD;
&lt;p&gt;打开&amp;#8220;页面设计&amp;#8221;时，自动将父页ASP.NET控件转换为HTML控件。&lt;/p&gt;&#xD;
&lt;p&gt;点击&amp;#8220;保存&amp;#8221;图标时，自动将HTML控件转换为ASP.NET控件。&lt;/p&gt;&#xD;
&lt;p&gt;可视化设计是源码文本编辑的有益补充。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/designFile_2.png" target="_blank"&gt;&lt;img title="designFile" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="440" alt="designFile" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/designFile_thumb.png" width="758" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;4.上传下载更新文件&lt;/p&gt;&#xD;
&lt;p&gt;可批量创建、替换文件，但不会删除。&lt;/p&gt;&#xD;
&lt;p&gt;可自动创建与ZIP包对应的目录结构。&lt;/p&gt;&#xD;
&lt;p&gt;可方便维护外置的css、script、image页面。&lt;/p&gt;&#xD;
&lt;p&gt;文件下载、文件夹下载可方便的进行表单备份、表单迁移到其他服务器等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/downloadFolder_2.png" target="_blank"&gt;&lt;img title="downloadFolder" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="514" alt="downloadFolder" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/downloadFolder_thumb.png" width="766" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;保存即可上传&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/uploadFolder_2.png" target="_blank"&gt;&lt;img title="uploadFolder" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="534" alt="uploadFolder" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/uploadFolder_thumb.png" width="787" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;上传后结果：自动创建文件夹、文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/uploadFolder2_2.png" target="_blank"&gt;&lt;img title="uploadFolder2" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="511" alt="uploadFolder2" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/uploadFolder2_thumb.png" width="786" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;5. 表单预览： 实时测试当前修改情况，预览效果出弹出窗口大小不同外，与最终效果完全一致&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/previewFile_2.png" target="_blank"&gt;&lt;img title="previewFile" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="476" alt="previewFile" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/previewFile_thumb.png" width="791" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;上图&amp;#8220;数据字典&amp;#8221;下拉框绑定可有下面两种方式：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/bindDrop_2.png" target="_blank"&gt;&lt;img title="bindDrop" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="401" alt="bindDrop" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/IPadBS_DA67/bindDrop_thumb.png" width="642" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;此系列文章：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/05/14/1735598.html" target="_blank"&gt;IPad上做开发&amp;#8212;&amp;#8212;在线B/S开发用户定制型通用列表&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/crabo/aggbug/1745431.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/05/27/online_develop_form.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/crabo/archive/2010/05/14/1735598.html</id><title type="text">IPad上做开发——在线B/S用户定制型通用列表</title><summary type="text">用户需求越来越不可调和， 经常出现10余个列需要展示， 而页面控件又相当有限， 而且不同的用户操作身份有要求了不同的展示集合。 为了解救一线兄弟们于水深火热，我刚刚整玩了这套&amp;#8220;用户定制&amp;#8221;列表： 开发人员定义大致模板， 最终用户可任意更改他的页面，叫做 Grid Per User. [对于回复中说道的源码的问题，首先80%的工作量就是列表定制， 而他就是源码公开的flexig...</summary><published>2010-05-14T08:38:00Z</published><updated>2010-05-14T08:38:00Z</updated><author><name>craboYang</name><uri>http://www.cnblogs.com/crabo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/crabo/archive/2010/05/14/1735598.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/crabo/archive/2010/05/14/1735598.html"/><content type="html">&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;用户需求越来越不可调和， 经常出现10余个列需要展示， 而页面控件又相当有限， 而且不同的用户操作身份有要求了不同的展示集合。&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;为了解救一线兄弟们于水深火热，我刚刚整玩了这套&amp;#8220;用户定制&amp;#8221;列表： 开发人员定义大致模板， 最终用户可任意更改他的页面，叫做 Grid Per User.&lt;/p&gt;&lt;p&gt;[对于回复中说道的源码的问题，首先80%的工作量就是列表定制， 而他就是源码公开的flexigrid。 另外20%的查询条件开发，也是非常简单。没必要再给出源码了。]&amp;nbsp;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;用户展示效果&lt;/li&gt; &lt;/ol&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/001_2.jpg" target="_blank"&gt;&lt;img title="001" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="396" alt="001" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/001_thumb.jpg" width="568" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2&amp;nbsp; 定制列： 就是jquery flexigrid的内容，不过他在IE兼容上还有很多的问题。我重点增强了自动宽度控制，可以设置列为20%,30%，使列宽度自适应。&lt;/p&gt;  &lt;p&gt;实现用户定制的有： 列显示/隐藏， 列顺序调整， 列宽度控制， 列排序方式， 页大小调整&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/002_2.jpg" target="_blank"&gt;&lt;img title="002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="368" alt="002" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/002_thumb.jpg" width="574" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;3. 定制查询条件： 在开发人员给定的范围内，自定义：&lt;/p&gt;  &lt;p&gt;条件项的显示/隐藏， 条件项默认值(加载时即可过滤)，查询项目自动排版，自定义项目配置保存/删除&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/003_1.jpg" target="_blank"&gt;&lt;img title="003" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="370" alt="003" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/003_thumb_1.jpg" width="582" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;开发人员界面：&lt;/p&gt;  &lt;p&gt;A. 列表自定义实现描述： flexigrid 的表述方式， 增加百分比宽度，自动宽度、自动高度。&lt;/p&gt;  &lt;p&gt;随时点击 &amp;#8220;预览&amp;#8221;，可以检查grid定义是否有效， 以及定义最终效果。&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/004_2.jpg" target="_blank"&gt;&lt;img title="004" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="394" alt="004" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/004_thumb.jpg" width="603" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;B. 查询配置&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font color="#000000"&gt;Filter的定义与grid很相似，查询项目可以配置时创建，也可以是已经定义的DOM元素，这样就可以实现灵活的功能、外观定制。（上图有个textbox叫做：Hidden DOM）&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;下图中间就是&amp;#8220;预览&amp;#8221; Filter的实时效果。&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;QueryInfo仅限与NHibernate的 HQL描述。 有NHibernate把关，可以不顾create,drop 之类高枕无忧了。&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/005_2.jpg" target="_blank"&gt;&lt;img title="005" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="388" alt="005" src="http://images.cnblogs.com/cnblogs_com/crabo/WindowsLiveWriter/js_EA0F/005_thumb.jpg" width="604" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;C. 额外定制的还有Toolbar、Script block。 通过这两部分配合，列表数据处理如日期格式化，列表按钮功能、列表数据点击效果都可以轻松实现。&lt;/p&gt;  &lt;p&gt;而且，随时随地&amp;#8220;预览&amp;#8221;哦， 比VS开发还要方便。 当然， 你最好有FireBug。 可怜的是， 我只用FireBug2.0，而现在已经下载不到了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/crabo/aggbug/1735598.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/crabo/archive/2010/05/14/1735598.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
