使用ASP.NET MVC,注解一下 

PO :persistent object持久对象

1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
2 .在hibernate持久化框架中与insert/delet操作密切相关。
3 .PO中不应该包含任何对数据库的操作。

这一对象,在我看来,就数据库嘛……

---------------------------------------------------------
POJO :plain ordinary java object 无规则简单java对象
一个中间对象,可以转化为PO、DTO、VO。
1 .POJO持久化之后==〉PO
(在运行期,由Hibernate中的cglib动态把POJO转换为PO,PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支持增量编译,增量调试。)
2 .POJO传输过程中==〉DTO
3 .POJO用作表示层==〉VO
PO 和VO都应该属于它。
在.Net多层结构中,叫做MODEL层或ENTITY层。如果用Entity Framework CodeFirst,就是POCO模型。
----------------------------------------------------------
BO :business object 业务对象
封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。
关于BO主要有三种概念
1 、只包含业务对象的属性;
2 、只包含业务方法;
3 、两者都包含。
在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。
Service层或BLL层
----------------------------------------------------------
VO :value object值对象 / view object表现层对象
1 .主要对应页面显示(web页面/swt、swing界面)的数据对象。
2 .可以和表对应,也可以不,这根据业务的需要。
注 :在struts中,用ActionForm做VO,需要做一个转换,因为PO是面向对象的,而ActionForm是和view对应的,要将几个PO要显示的属性合成一个ActionForm,可以使用BeanUtils的copy方法。
传说中的VIEWMODEL,MVVM模式中不可少的一部分。在ASP.NET MVC中亦很重要的界面模型。 
----------------------------------------------------------
DTO (TO) :Data Transfer Object数据传输对象
1 .用在需要跨进程或远程传输时,它不应该包含业务逻辑。
2 .比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO 内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

在我看来这就是VO....

----------------------------------------------------------
DAO :data access object数据访问对象
1 .主要用来封装对DB的访问(CRUD操作)。
2 .通过接收Business层的数据,把POJO持久化为PO。

Entityframe Work也好 Repository也好 DAL也好,都是它了

posted @ 2012-04-12 23:13 李宏 阅读(22) 评论(2) 编辑

为ExtJS 4 系列树添加可将节点拖动到叶子节点上的功能,可配置。

使用方法:将以下代码复制,新建立一js文件后,将其引用在ext核心js后即可。 

使用时,通过allowLeafInserts属性进行叶子节点是否可拖动的配置,默认值为true。 

啊啊啊啊…………又通宵了…… 

  1 /*以下改动为是:给树添加允许为叶子节点添加子节点功能 --by lihong 2012/2/24
  2 通过TreeViewDragDrop的allowLeafInserts为true或false进行配置 
  3 例:
  4 //    Ext.define('myTree', {
  5 //        extend: 'Ext.tree.Panel',
  6 //        viewConfig: {
  7 //            plugins: {
  8 //                ptype: 'treeviewdragdrop',
  9 //                allowLeafInserts : true
 10 //            }
 11 //        }
 12 //    }
 13 //*/    
 14 Ext.override(Ext.tree.ViewDropZone, {
 15     getPosition: function (e, node) {
 16         var view = this.view,
 17         record = view.getRecord(node),
 18         y = e.getPageY(),
 19         noAppend = record.isLeaf(),
 20         noBelow = false,
 21         region = Ext.fly(node).getRegion(),
 22         fragment;
 23 
 24         if (record.isRoot()) {
 25             return 'append';
 26         }
 27 
 28         if (this.appendOnly) {
 29             return noAppend ? false : 'append';
 30         }
 31         if (!this.allowParentInsert) {
 32             //leehom modify begin
 33             noBelow = this.allowLeafInserts || (record.hasChildNodes() && record.isExpanded());
 34             //leehom modify end
 35         }
 36 
 37         fragment = (region.bottom - region.top) / (noAppend ? 2 : 3);
 38         if (y >= region.top && y < (region.top + fragment)) {
 39             return 'before';
 40         }
 41         else if (!noBelow && (noAppend || (y >= (region.bottom - fragment) && y <= region.bottom))) {
 42             return 'after';
 43         }
 44         else {
 45             return 'append';
 46         }
 47     },
 48     handleNodeDrop: function (data, targetNode, position) {
 49         var me = this,
 50         view = me.view,
 51         parentNode = targetNode.parentNode,
 52         store = view.getStore(),
 53         recordDomNodes = [],
 54         records, i, len,
 55         insertionMethod, argList,
 56         needTargetExpand,
 57         transferData,
 58         processDrop;
 59         if (data.copy) {
 60             records = data.records;
 61             data.records = [];
 62             for (i = 0, len = records.length; i < len; i++) {
 63                 data.records.push(Ext.apply({}, records[i].data));
 64             }
 65         }
 66         me.cancelExpand();
 67         if (position == 'before') {
 68             insertionMethod = parentNode.insertBefore;
 69             argList = [null, targetNode];
 70             targetNode = parentNode;
 71         }
 72         else if (position == 'after') {
 73             if (targetNode.nextSibling) {
 74                 insertionMethod = parentNode.insertBefore;
 75                 argList = [null, targetNode.nextSibling];
 76             }
 77             else {
 78                 insertionMethod = parentNode.appendChild;
 79                 argList = [null];
 80             }
 81             targetNode = parentNode;
 82         }
 83         else {
 84             //leehom add begin
 85             if (this.allowLeafInserts) {
 86                 if (targetNode.get('leaf')) {
 87                     targetNode.set('leaf', false);
 88                     targetNode.set('expanded', true);
 89                 }
 90             }
 91             //leehom add end
 92             if (!targetNode.isExpanded()) {
 93                 needTargetExpand = true;
 94             }
 95             insertionMethod = targetNode.appendChild;
 96             argList = [null];
 97         }
 98 
 99         transferData = function () {
100             var node;
101             for (i = 0, len = data.records.length; i < len; i++) {
102                 argList[0] = data.records[i];
103                 node = insertionMethod.apply(targetNode, argList);
104 
105                 if (Ext.enableFx && me.dropHighlight) {
106                     recordDomNodes.push(view.getNode(node));
107                 }
108             }
109             if (Ext.enableFx && me.dropHighlight) {
110                 Ext.Array.forEach(recordDomNodes, function (n) {
111                     if (n) {
112                         Ext.fly(n.firstChild ? n.firstChild : n).highlight(me.dropHighlightColor);
113                     }
114                 });
115             }
116         };
117         if (needTargetExpand) {
118             targetNode.expand(false, transferData);
119         }
120         else {
121             transferData();
122         }
123     }
124 });
125 
126 
127 Ext.override(Ext.tree.plugin.TreeViewDragDrop, {
128     allowLeafInserts: true,
129 
130     onViewRender: function (view) {
131         var me = this;
132         if (me.enableDrag) {
133             me.dragZone = Ext.create('Ext.tree.ViewDragZone', {
134                 view: view,
135                 allowLeafInserts: me.allowLeafInserts,
136                 ddGroup: me.dragGroup || me.ddGroup,
137                 dragText: me.dragText,
138                 repairHighlightColor: me.nodeHighlightColor,
139                 repairHighlight: me.nodeHighlightOnRepair
140             });
141         }
142 
143         if (me.enableDrop) {
144             me.dropZone = Ext.create('Ext.tree.ViewDropZone', {
145                 view: view,
146                 ddGroup: me.dropGroup || me.ddGroup,
147                 allowContainerDrops: me.allowContainerDrops,
148                 appendOnly: me.appendOnly,
149                 allowLeafInserts: me.allowLeafInserts,
150                 allowParentInserts: me.allowParentInserts,
151                 expandDelay: me.expandDelay,
152                 dropHighlightColor: me.nodeHighlightColor,
153                 dropHighlight: me.nodeHighlightOnDrop
154             });
155         }
156     }
157 });
158 ////////////////树叶子节点改动结束//////////////////////////////////////////////////////////  
posted @ 2012-02-24 05:29 李宏 阅读(287) 评论(1) 编辑

找到 Ext.ux.grid.menu.ListMenu 类,位于 extjs/examples/us/grid/menu/listmenu.js。

修改show方法为:

show: function () {
    var lastArgs = null;
    return function () {
        if (this.loadOnShow && !this.loaded) {
            this.store.load();
            this.callParent(lastArgs);
        } else {
            this.callParent(lastArgs);
        }
    };
} (), 

或使用Ext.override方法在其它文件进行修正。推荐使用override方法。

修改后,使用正常。

var listProvince = Ext.create("SMS.store.Selected.Province");
var filgerColumns = [
	{ dataIndex: 'ID' },
	{ dataIndex: 'ProvinceID', type: 'list', store: listProvince, labelField: 'text' },
	{ dataIndex: 'Name' }
];

image

posted @ 2011-08-24 14:44 李宏 阅读(129) 评论(1) 编辑
.x-btn-default-small .x-btn-inner, .x-btn-default-medium .x-btn-inner, .x-btn-default-large .x-btn-inner, .x-btn-default-toolbar-small .x-btn-inner, .x-btn-default-toolbar-medium .x-btn-inner, .x-btn-default-toolbar-large .x-btn-inner, .x-menu-item-text, .x-html-editor-tb .x-font-select, .x-panel-header-default, .x-panel-header-text-default, .x-panel-header-default-framed, .x-tip-header, .x-tip-body, .x-form-invalid-tip-body, .x-tip-header-text, .x-progress-text, .x-toolbar, .x-toolbar .x-form-item-label, .x-toolbar .x-toolbar-text, .x-window-header-text-default, .x-tab-bar, .x-tab button, .x-grid-rowbody, .x-grid-row .x-grid-cell, .x-grid-group-title, .x-grid-row-editor .x-form-field, .x-grid-row-editor .x-form-display-field, .x-form-invalid-under, .x-fieldset-header, .x-column-header, .x-mask-msg div, .x-btn-group-header-text-default-framed, table.x-datepicker-inner a, .x-monthpicker-item, .x-dd-drag-ghost
{
    font-size
: 12px;
}

.x-column-header
{
    text-shadow:0 0 0 rgba(255, 255, 255, 0.3);
}
将以上代码保存为css文件,在ext-all.css后引入即可。
posted @ 2011-08-24 14:38 李宏 阅读(501) 评论(0) 编辑
写了一通宵的表达式树实现动态拼接查询条件,才发现MICROSOFT提供了System.Linq.Dynamic这个东东……悲剧,吐血……
posted @ 2011-08-15 16:55 李宏 阅读(25) 评论(0) 编辑

搞培训这么多年了,可相关学习文档一直不满意,现准备重新编写相关部分,目录如下:

  1. HTML概述
  2. HTML语法
  3. HTML标签
  4. HTML实例--用户注册页面
  5. CSS概述
  6. CSS语法
  7. CSS选择器
  8. 文档流与盒子模型(块、内联、行、内容、可转换)
  9. CSS实例--用户注册页面
  10. 浏览器兼容性问题
  11. JavaScript概述
  12. JavaScript语法
  13. JQUERY
  14. BOM
  15. DOM(JS重点,使用JS与JQUERY同时实现代码)
  16. 综合实例--企业网页(7个页面,首页、文章列表、文章显示、产品列表、产品展示、留言列表、留言发布、单栏目页)
  17. 综合实例--后台管理界面(4个页面,登陆、管理框架、列表、编辑)

不定期更新中………………

posted @ 2011-08-09 19:12 李宏 阅读(154) 评论(3) 编辑
摘要:     关于EF、SL、DomainDataSource的说明园子上够多了,这儿就不多说了。     1.安装VS2010与Silverlight 4 Tools……     2.打开VS2010,新键Silverlight项目,如图一所示: 图1.新键项目     注:请选中"启用WCF RIA服务"的CheckBox.     建立好项目后,解决方案里的文件如图2所示: 图2.解决方案...阅读全文
posted @ 2010-07-09 16:49 李宏 阅读(483) 评论(14) 编辑
摘要: 1.在SL中查询时,记得using System.ServiceModel.DomainServices.Client,否则会出现xxx.GetxxxQuerys()不出现Take、Where等等扩展方法,也不能 from x in xxx.xxxx where。会报如下异常:未能为源类型“System.ServiceModel.DomainServices.Client.Entity...阅读全文
posted @ 2010-06-03 03:48 李宏 阅读(199) 评论(1) 编辑
摘要: Visual Studio 2010 Professional:emule下载:ed2k://|file|cn_visual_studio_2010_professional_x86_dvd_532145.iso|2591844352|6001253431afe573e4344f5a0b1d9cac|/Visual Studio 2010 Ultimate:emule下载:ed2k://|file...阅读全文
posted @ 2010-05-28 23:34 李宏 阅读(474) 评论(2) 编辑
摘要: Choose one of the following download options:Download the .exe file and the .rar files on this page, and save them on your computer. On the computer, double-click the .exe file to extract the ISO imag...阅读全文
posted @ 2010-04-13 01:07 李宏 阅读(644) 评论(3) 编辑