最近在开发.net项目时项目组完全抛弃了之前的VSS,开始全面使用SVN管理版本。虽然SVN非常不错,但是也给项目组带来了一些不小的麻烦。麻烦就是一些VS自动生成的二进制文件夹以及一些如*.suo *.user等二进制文件经常引起冲突。bin和obj内的dll文件往往是调试时产生的,这些文件如果进入版本库,那简直就是灾难,特别是一个solution下面有多个工程的时候。
     网上有说,对整个解决方案目录设置属性,排除这些文件,不过我发现正常使用还不错,但一打分支然后再切回来时,这些设置就丢失了,面对7、8个人的团队,版本冲突解决是件痛苦的事情。
     终于我发现了,原来全局排除可以快速解决这个问题,在TortoiseSVN中点击General,然后在Global ignore pattern中设置我们项目中不想进入版本库的文件或文件夹以空格分开即可,如我们组最讨厌以下目录:*.suo Bin log4net Obj obj bin *.user ,那么就设置如下图。之后点击“应用”,我们又一次感受到生活的美好了。

image

posted @ 2010-08-07 15:23 cfanseal 阅读(594) 评论(5) 编辑

     最近好忙,连续加班好几周了。虽然辛苦,但却颇有收获,最大的收获是新项目用了ASP.NET  MVC。要说的是ASP.Net Mvc 还真好。等项目忙好了,我计划针对项目中学到的技术点做个总结,写一些小例子以便日后可以用。

     ASP.Net MVC 给我最大的印象是清晰,在写代码时不再有传统ASP.net 编写时对事件的困惑。一切又回归自然,回归平静。我们开始静下心来看页面的效果如何实现;我们开始关注页面逻辑;我们开始关注URL语义化;我们开始关注如何分层设计;甚至我们成功的将TDD与DDD的理念引入我们的开发中。项目进展还算顺利,但日后还有更多的事情要做。

     项目的范围还算可以,这次要做的国际化网站,且是基于SOA的。谈到开头说的总结,我想应该从以下几点开始:

1、Oracle Session Provider,这是节省团队时间的好办法,Session是要用的,在多台服务器部署的情况下就得考虑Session 同步问题。

2、ModelBinder + Castle components validator 实现多语言模型层校验,最让我激动的是castle验证框架的优良设计,如此多的验证标签以及无敌的validateself,几乎能涵盖所有的后端复杂校验了

3、ajax+ modelbinder 实现完全基于后端的校验,由于需要支持多语言,验证后的提示信息如何有支持多语言是个大问题。配置多分js文件,噢~!还是算了吧。如此多的语言版本都一次性引入,页面的打开速度将是大问题。没想到jQuery的serialize除了能将整个表单内容序列化外,在服务器端强大的DefaultModelBinder帮助下能将ajax提交的表达直接绑定成我们要的对象。这对表单整体校验实在是作用太大了。

4、mvc2与mvc1还是有很大不同地方的;Mvc contrib真是一个非常好的类库,但最常用的恐怕还是fluntHtml

5、Vs2010 Service Reference 自动生成的代码虽然代码中明确runtime是4.0,但实际中.net 3.5环境下运行非常正常。而且在java Integer 生成的代码往往是int?,那么在调用的时候一定要指明xxxIsSpecifed也就不用了。

posted @ 2010-06-18 23:17 cfanseal 阅读(61) 评论(0) 编辑
ADO.net架构的优良使得,C#操作多数库访问异常方便,我们可以将驱动写在连接字符串里,
利用 DbProviderFactory 获取驱动的工厂,示例代码如下
/// <summary>
/// 数据库操作帮助类,可处理CRUD 操作,和存储过程调用
/// </summary>
public class Dbutil
{
    private DbProviderFactory _factory;
    private string _connectionString;
    private string _connectioinName;

    public string ConnectionName
    {
        get { return _connectioinName; }
        set
        {
            _connectioinName = value;
            _connectionString = ConfigurationManager.ConnectionStrings[value].ConnectionString;
            _factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings[value].ProviderName);
        }
    }

    public Dbutil(string connName)
    {
        ConnectionName = connName;
    }

    public DataSet ExecuteDataSet(string sql, List<DbParameter> list)
    {
        using (DbConnection conn = _factory.CreateConnection())
        using (DbCommand cmd = _factory.CreateCommand())
        using (DbDataAdapter da = _factory.CreateDataAdapter())
        {
            conn.ConnectionString = _connectionString;
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;
            da.SelectCommand = cmd;

            foreach (DbParameter i in list)
            {
                cmd.Parameters.Add(i);
            }
           
            using (DataSet ds = new DataSet())
            {
                conn.Open();
                da.Fill(ds);
                return ds;
            }
        }
    }

    public int ExecuteNonQuery(string sql)
    {
        using (DbConnection conn = _factory.CreateConnection())
        using (DbCommand cmd = _factory.CreateCommand())
        {
            conn.ConnectionString = _connectionString;
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;
            conn.Open();
           
            return cmd.ExecuteNonQuery();
        }

    }


    public int ExecuteNonQuery(string sql, List<DbParameter> list)
    {
        using (DbConnection conn = _factory.CreateConnection())
        using (DbCommand cmd = _factory.CreateCommand())
        {
            conn.ConnectionString = _connectionString;
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;

            foreach (DbParameter i in list)
            {
                cmd.Parameters.Add(i);
            }
            conn.Open();
            return cmd.ExecuteNonQuery();
        }

    }

    public IEnumerable<object> ExecuteProcedure(string procedureName, List<DbParameter> list)
    {
        using (DbConnection conn = _factory.CreateConnection())
        using (DbCommand cmd = _factory.CreateCommand())
        {
            conn.ConnectionString = _connectionString;
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procedureName;

            foreach (DbParameter i in list)
            {
                cmd.Parameters.Add(i);
            }
            conn.Open();
            var res = cmd.ExecuteNonQuery();
            yield return res;
            foreach (DbParameter i in list)
            {
                if (i.Direction == ParameterDirection.Output)
                    yield return i.Value;
            }

        }
    }
}

 

 
posted @ 2010-03-15 15:44 cfanseal 阅读(95) 评论(0) 编辑
 1:  public void SSLLearning()
 2:  {
 3:      ServicePointManager.ServerCertificateValidationCallback 
            = new RemoteCertificateValidationCallback((a, b, c, d) => { return true; });
 4:      SSLWebService sws = new SSLWebService();
 5:      cws.ClientCertificates.Add(
            X509Certificate.CreateFromCertFile(Path.GetFullPath(@"../../") + @"Resources\cerfile.cer"));
 6:      sws.DoSomeThing(“Hello World!”);
 7:  }

     以上是调用基于SSL 的WebService 的示例代码,其中ServicePointManager.ServerCertificateValidationCallback… 这段代码 是表示不对服务端证书进行有效性校验(非第三方权威机构颁发的证书,如自己生成的) 。

     ((a, b, c, d) => { return true; }) 是.Net 3.5的新特性lambda 表达式,这样就不用先写一个函数,再传入函数名给RemoteCertificateValidationCallback

     Path.GetFullPath()可以传入相对路径,就如示例代码一样。比AppDomain.CurrentDoman.BaseDirectory再过滤字符串方便多啦

     设置了ClientCertificates后 后续的调用过程就和普通http连接一样啦。唉,虽然调用成功了,不过webservice 在.net 平台似乎是比较古老的技术了,网上搜到的关于webservice的书也只有2003年的了,要加油学习WCF啦!    

posted @ 2010-03-14 02:45 cfanseal 阅读(545) 评论(0) 编辑

在写Web 应用,或者Web Ajax功能的时候我们经常需要处理事件,jquery已经非常完美的封装了事件,但是有时候事件的执行顺序还是会有微小差别

前两天做城市搜索的时候,我对搜索按钮绑定了事件,如果输入栏内的文字不符合要求就用标签提示(标签展示出来后对document绑定click,点击后隐

藏标签)并使输入栏获得焦点。就这样一个小功能我调试了、3个多小时,IE 里表现的是标签一闪而过,后来发现是按钮的点击事件和input的交替出发了

多次,估计是事件回退发生的,用了preventDefault() 和 stopPropagation()两个函数后修正了问题。虽然问题解决了,但是事件的执行顺序真是很难

掌握呀,于是我做了个简单的事件监测函数,可以自动记录页面事件触发,见如下代码(首先肯定要引入jquery!...)

 

//事件执行监测
function eventsMonitor(op){
    
var defaultSetting = {
        eventsStr: 
"click focus blur",
        splitStr: 
" ",
        css:{
            
"border":"1px red solid",
            
"z-index":9000000,
            
"background":"white",
            
"position":"absolute",
            width:
400,
            height:
200,
            
"overflow-x":"hidden",
            
"overflow-y":"auto"
        }
    };
    
var ops = $.extend(true,defaultSetting,op); 
    $(
'<div id="DivForLogEvents"><div></div><div>').appendTo("body").css(ops.css);
    
var $infolog = $("#DivForLogEvents div:eq(0)");
    $.each(ops.eventsStr.split(ops.splitStr),
function(i,v){
        
if(v != 'resize')
            $(
"*:not('#DivForLogEvents')").bind(v, function(e){                
                
if(!$(e.target).is("#DivForLogEvents"&& !$(e.target).is($infolog)){
                    $infolog.append((e.target.nodeName
||" "+ "->" + (e.target.id||e.target.Name||" "+ " "+v+" event!<br>");
                    $(
"#DivForLogEvents:not(:animated)").animate({scrollTop:$infolog.height()},300);
                }
            });
        
else
            $(window).bind(
'resize'function(e){                
                
if(!$(e.target).is("#DivForLogEvents"&& !$(e.target).is($infolog)){
                    $infolog.append((e.target.nodeName
||" "+ "->" + (e.target.id||e.target.Name||" "+ " "+v+" event!<br>");
                    $(
"#DivForLogEvents:not(:animated)").animate({scrollTop:$infolog.height()},300);
                }
            });
    });
}

 

调用方法示例

 

代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    
<head>
        
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        
<title>Untitled Document</title>
        
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script><!--Google CDN-->
        
<script type="text/javascript" src="eventsMonitor.js"></script><!--Google CDN-->
        
<script type="text/javascript">
            
            $(document).ready(
function(){
                eventsMonitor({
                    css:{top:
0,right:20},
                    eventsStr:
"click blur focus select scroll mousewheel resize"
                });
                
                $(
"#info").click(function(){$(this).text($("#DivForLogEvents").outerHeight());});
            });
            
        
</script>
    
</head>
    
<body>
        
        Hello world
        
<img src="http://images.cnblogs.com/logo_small.gif" />
        
<input type="text" id="name" value="测试" />
        
<span id="info">ffffffff</span>
        
    
</body>
</html>

 

效果截图

posted @ 2009-12-08 14:48 cfanseal 阅读(151) 评论(0) 编辑
摘要: 虽然行为不怎么好,但是事件停止的函数可以参考一下代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//停止事件冒泡functionstopPropagation(event){vare=event||window.event;if(e.stopPro...阅读全文
posted @ 2009-12-06 14:59 cfanseal 阅读(84) 评论(0) 编辑
摘要: 当用visual studio 2008 建立 WEB Site工程后调用某一页面预览会启动vs内置的web server 它会默认使用工程名作为虚拟路径,所以如果访问根目录的test.aspx则实际上会转到如:http://localhost:2319/projectName/test.aspx这样的url上,这样。当页面需要用“绝对路径”时,如果是服务器控件可以用路径前...阅读全文
posted @ 2009-11-04 15:52 cfanseal 阅读(160) 评论(1) 编辑
摘要: 在工作中我碰到这样一个问题,session表需要用到timestamp的字段,在进行timestamp字段更新时出现了为题,比如需要对session的有效期增加1小时。采用 systimestamp + 1/24 会丢失秒后的精度,感觉增加之后就变成了date型的样子。经过研究发现oracle 有个函数叫NUMTODSINTERVAL ,可以解决这个问题。下面两个例子说明如何使用这个函数增加一小时...阅读全文
posted @ 2009-10-08 17:29 cfanseal 阅读(149) 评论(0) 编辑
摘要: .Net 网站项目引用类库时,有时在类库里需要调用文件如xml,此时时文件路径比较难找到,研究了一下,暂时得出以下的解决方案。首先目录安排如下solution |--project | |--xml | | |--test.xml | |--Class1.cs |--web |--Default.aspx现在web 引用 project项目,在Default.aspx中要申请Class1对象,对...阅读全文
posted @ 2009-09-30 15:30 cfanseal 阅读(318) 评论(0) 编辑
摘要: ASP 中也可以用正则表达式,为了方便使用,对正则表达式操作进行了封装,目前只封装了两个:1、正则替换[代码]用法举例:如剔除一个字符串中所有的html标签[代码]2、正则检测[代码]用法举例:检测一个字符串中是否有html字符串[代码]阅读全文
posted @ 2009-07-08 14:04 cfanseal 阅读(125) 评论(0) 编辑