
2012年1月13日
这两天做一个小工具,需要让用户提供数据库连接字符串,锉方法是让用户输入一个字符串,稍好点方式的是提供一个字符串让用户去改,更好呢,就是提供一个像VS中那样一个可以生成数据库连接字符串的对话框了。从很久以前开始,M$就提供了这样的组件,我至少在VS的安装目录下发现了两个Assembly中包含了DataConnectionDialog,分别是:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Microsoft.Data.ConnectionUI.Dialog.dll和C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Microsoft.VisualStudio.Data,但是今天我们不使用这两种方式,为啥咧?原因是他们里面没有带MySQL类型的数据源,虽然也可以通过不算十分复杂的过程将MySQL加进来,但是对于懒人来说,什么都不做岂不更好,我正好就是个懒人,在允许的情况下,我更愿意让脑神经放松下来,去干点更值当点的工作。
最初觉得既然使用了MySQL Connector/Net,那这个Dialog就应该是在MySql.Data.dll中了,但是一阵好找发现这个MySql.Data命名空间下,连个继承Form的类都没有,貌似不可能提供这种对话框的功能了,无奈之下想起了MySql Connector/Net应该是提供源代码的,于是到MySql的官网上下载了一份源代码,看看到底内部是怎么做的,很失望,依然是没有找到,不过在这份源代码的解决方案中发现了一个未能正常加载的项目,MySql.VisualStudio!哈哈,看着名字就像,按常理来说,应该有个MySql.VisualStudio.dll存在某处,F3一下,果然,在C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Oracle\MySQL Connector Net\6.4.4文件夹中找到了,于是赶紧引用到项目中,一试,果然获得了MySql的连接字符串

示例代码:
private void btnConnect_Click(object sender, EventArgs e)
{
ConnectDialog dialog = new ConnectDialog();
dialog.StartPosition = FormStartPosition.CenterScreen;
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
try
{
txtConnect.Text = dialog.Connection.ConnectionString;
}
catch
{
}
}
}
这里稍值得说明的是为啥要放在一个try里呢,原因是,当你点击了"Connect"按钮后,其实这个Dialog只是简单的返回了一个DialogResult.OK,在调用Dialog.Connection属性时会尝试连接数据源,如果你提供的连接选项有问题,那就要报异常了,因此包在一个try...catch中了。
posted @ 2012-01-13 15:42 think8848 阅读(5) 评论(0)
编辑

2011年12月11日
好久没有更新博客了,也不知道每天在忙什么,好像挺忙的,但是一点有系统有东西似乎都没有搞出来,今天闲来无事,算是发一个口水帖。最近一段时间以来因为工作上的需要,开始学习Object-C了,当然,主要的方向是iOS,通过一段学习,算是掌握了些皮毛吧。本来非常担心内存管理的问题,但经过一番了解后,发现原来这并不是一件非常困难的事,更没有想到的是XCode 4.2.1中,居然有了自动引用记数(ARC)这么个东西,一下子让事情变的简单了,虽然在iPhone没有垃圾回收机制,但是编译器自动帮你写了那些诸如dealloc,release,autorelease之类的语句了,这对于习惯了C#语法的人来说,不啻为一个福音啊。总的说来,Cocoa Touch中类型的命名还是让人感觉舒服,Object-C的方法签名模式也相当不错,以前使用其他语言时老是感觉文不达意,使用Object-C定义方法时就不会有这种尴尬了。基于我的了解,我发现C#程序员去学Object-C应该不算一件很难的事。
在iPhone开发时,在UINavigationController或UITabBarController上因BarButtonItem太多而位置不够用时,多会选择使用UIActionSheet,但UIActionSheet的显示区域较大,而且UIActionSheet和UIAlertView一样,都是iOS SDK中自带的类型,想要对其样式做些个性化的处理就稍麻烦了。

UIActionSheet样式
在我现在的项目中,也有类似的需求,要在点击一个BarButtonItem后显示更多的操作,有点类似UC浏览器工具栏最中间的那个按钮(“更多”)点击后的效果

UC浏览器的Popover样式
貌似在Apple建议中,不推荐使用Popover样式,因为iPhone屏幕本来就不大,如果放太多东西了不好,但是UIActionSheet个人感觉实在是看起来不咋的,还是想使用Popover样式,但是又不知道该怎么实现,经过一番好找,在Apple官方的示例中找到一个例程(ToolbarSearch),其中使用UIPopoverController类,实现了这个功能,结果激动劲还没有过,发现一个非常悲惨的现实,这个类型只能使用于iPad,而不能使用于iPhone上!!!原因还是基于Apple认为应该在iPhone上使用UIActionSheet!
我觉得肯定有方法能使用在iPhone上(现成的代码,而不是自已去实现一个),经过又一番好找,终于发现了了WEPopover,一个相当不错的包,项目地址:
https://github.com/werner77/WEPopover
现在,剩下最后一个问题了,在启用了ARC的环境下如何使用WEPopover,很快,找到了几个ARC的实现:
https://github.com/pmilanez/WEPopover
https://github.com/dhoerl/WEPopover
https://github.com/darknoon/WEPopover/tree/feature/arc
WEPopover效果图

posted @ 2011-12-11 13:01 think8848 阅读(48) 评论(0)
编辑

2011年10月14日
每年春节晚会接近尾声时,总会唱响《难忘今宵》这首歌曲,每每这个时刻,我总有些许的期待,但更多的是浓浓的忧伤。我也不清楚在忧伤什么,是逝去的亲人,渐疏的友情,抑或是湮灭的韶华?我很难说清楚,隐约间似乎听到从内心传来的细微声音:“不要这么快,不要这么快”...
到了分手的时间,才体会到什么是相见时难别亦难,有时候真的很羡慕金鱼,因为据说金鱼的记忆只有三秒钟,这样就可以彼此忘记,了无牵挂。“相濡以沫,不如相忘于江湖”这句话原是很有道理的。
我的内心挣扎着想要留下来,但是我又有太多的理由要走,非常非常纠结,其程度不亚于我人生中每一次重大抉择。一直以来,我尽力想做一个有情有义的人,But … OK,我承认,在很多的情况下还是选择了自已那点卑微的私念。我知道,这次出走真可谓负明软良多。
在这将要分别的日子,我首先要感谢Cathy,Cathy缔造了明软,才使我们大家有机会在这里相聚,有机会在这里学习,发展并获得生活所必需的资源;其次,我要感谢Ed,如果不是Ed垂顾,我也许还在富士康里面继续在适应它的企业文化,同时Ed给予了我开阔的架构思想;再次,我要感谢俊彧,俊彧给了我充分的信任和空间,使我那点小小的力量有了发挥的舞台;最后,我要感谢明软的每一个人,谢谢你们慷慨,你们给予我的每一点一滴的支持和帮助,我都将铭记于心,也正是有了你们每一分子,才有一个完整的明软,才有我的明软历程。同时,我也愧对这些给予我很多机会和帮助的人,对于Cathy,我食君之禄,却未能为君分忧;对于Ed,我没有报答知遇之恩;尤其对于俊彧、树立、郑飞,我几乎是在他们最需要我的时候离开了他们;还有所有留在明软的兄弟姐妹,不能跟随你们在这险恶的环境中一起战斗,我内心非常非常愧疚。
在这临别之际,对于留在明软继续战斗的兄弟姐妹,我向你们送上我的祝福,并附上我一点点个人对于工作,学习的体会,以供参考:
工作:这个世界没有无缘无故的爱,为爱工作而爱工作这个命题不成立,但是为了兴趣,为了待遇,为了理想爱工作,就很正常了。正如你向你心爱的人示爱一样。只有你付出了,才会有收获。很多时候,员工总是认为公司的挣不挣钱是老板的事,和自已关系不大;或者就是认为我自已拿这点钱,做这点事就算对得起老板了,对于大型企业也许个别员工这么想想倒关系不大,但是对于软件行业,尤其是软件行业中的中小企业,一个人的这种想法,有可能会害死公司,也会伤害其他积极努力的同事,最终害了自已。产生了这种想法的人永远不会受到老板的器重以及同事们的尊重。有此想法趁早找个工厂当IT养老吧。
学习:必须知道学习是在为谁在学,在经理?老板?还是自已,甚至延伸到父母妻儿?劝学的文章很多,我就不在这里献丑了,一句话,谁学谁知道。
年年都唱《难忘今宵》,年年的演唱又不尽相同,尽管每年的《难忘今宵》让我伤感,伤感时光飞转,岁月流逝,但来年的《难忘今宵》都如约等在那里,没有因个人的好恶停驻或者爽约,如同明软时而送走一位老同事,时而迎来一位新同事一样,没有人能知道在下一刻时间,送走的是谁,迎来的又是谁,每思及此,令人扼腕怅然。人的一生中会历经很多个抉择,某个地方,也许会成为终生的归宿,而更多的地方,很遗憾的作为了暂泊的驿站,今日看来明软之于我,许是个驿站,我之于明软,许是个过客,偏又这个驿站留给我的痕迹太多,太深,太匆匆…很多年以前,我的主管对于我的离去说:“打工么,就是这样人来人往,想开些…”,只是可惜,我至今仍没有看开。然而正因为有了分别,才有了重逢,人道:山不转水转,人又道:青山不改,绿水长流,难料将来不会与诸位中的某些人出现此间别后,山水再相逢的情形,待到那时,把酒言欢,欣喜至哉。无论《难忘今宵》如何让人唏嘘不已,但所幸最后几句,还是让人欣慰的:“告别今宵,不论新友与故交,明年春来再相邀,青山在人未老”,有鉴于斯,我觉得自已倒不必太过伤怀,毕竟,我们青山还在,人仍未老。
祝愿明软的明天会更好!
于2011-10-14
posted @ 2011-10-14 19:45 think8848 阅读(15) 评论(0)
编辑

2011年9月28日
转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)。未经作者同意,请勿擅自修改本文内容。
这两天项目中要用到类似于ListBox的功能了,本以为有很多jQuery插件,没有想到的是,居然没有搜到好用的,咋办呢,自已动手丰衣足食吧,于是花了一个晚上的时间做出来一个,上效果图:

该ListBox插件支持拖放,多选。
应用说明:
HTML:
Javascript:
$('#left').listbox({
data: '/Data/Index?' + new Date().getTime(),
width: 200,
height: 300
});
默认选项说明:
Options:
dnd: 是否支持拖放,默认false
dndscope: 支持拖放时相关的作用域,举例来说,即,A ListBox和B ListBox的dndscope相同,则这两个ListBox中的元素是可以相互拖放的
height: 地球人都知道,默认'auto'
width: 火星人也知道了,默认'auto'
data: 数据源,即可以是url也可以是对象数组,默认为[];
无论是远程还是本地数据均有两种格式:
1. {value: '', text: ''}
2. ['', ''],在这种情况下,请将value置于第一个元素
multiselect: 是否允许多选,默认false
ajaxsettings: 如果需要从远程获取数据,这里定义了$.ajax的默认选项
默认:
type: 'GET'
dataType: 'json'
success: funtion(data){}
Events:
2011.9.30 1.1版删除
itemselected: ListBox中的元素选中的被触发;
定义:function(data){},参数data为选中的元素数组
2011.9.30 1.1版新增
selectchange: ListBox中的元素选中项发生变化时被触发;
定义:function(data){},参数data为选中的元素数组
Methods:
addItem: 添加一个元素;
定义:function(data){},其中data类型为{value: '', text: ''}或['', '']
示例:
$('#btnAddItem').click(function () {
$('#left').listbox().addItem({ value: 3, text: 'c' });
});
addRange: 添加元素数组;
定义:function(data){},其中data类型为由{value: '', text: ''}或['', '']组成的数组
示例:
$('#btnAddRange').click(function () {
$('#left').listbox().addRange([{ value: 4, text: 'd' }, ['5', 'e']]);
});
clear: 清除所有元素
定义: function(){}
示例:
$('#btnClear').click(function () {
$('#left').listbox().clear();
});
getData: 获取与指定jQuery对象关联的数据
定义:function(a){},参数a为ListBox元素的a标签,ListBox元素的DOM结构为<li><a></a></li>
示例:
$('#btnGetData').click(function () {
var a = $('#left a:first');
if (a.size() > 0) {
var data = $('#left').listbox().getData(a);
alert("{value: '" + data.value + "', text: '" + data.text + "'}");
}
});
getDatas: 获取所有数据
定义: function(){}
示例:
$('#btnGetDatas').click(function () {
alert($('#left').listbox().getDatas().length);
});
getSelected: 获取所有选中的数据
定义:function(){}
示例:
$('#btnGetSelected').click(function () {
alert($('#left').listbox().getSelected().length);
});
2011.9.30 1.1版新增
reload: 重新加载ListBox中的数据
定义:function(data,ajaxsettings){},参数data,ajaxsettins定义同Options中同名属性data的定义
示例:
$('#btnReload').click(function () {
$('#left').listbox().reload({ data: '/Data/Index', ajaxsettings: {
data: { id: 'a' }
}
});
});
removeItem: 删除指定value值的元素
定义:function(data){},参数data可以为单个值,也可以为{value:''}对象
示例:
$('#btnRemoveItem').click(function () {
$('#left').listbox().removeItem({ value: 1 });
});
removeRange: 删除指定value值数组的元素
定义:function(data){},参数data为单个值,或{value:''}对象的数组
示例:
$('#btnRemoveRange').click(function () {
var datas = $('#left').listbox().getDatas();
$('#left').listbox().removeRange(datas);
});
setSelection: 选中指定value值的元素
定义: function(value){},参数value为单个值
示例:
$('#btnSetSelection').click(function () {
$('#left').listbox().setSelection(1);
});
调用方法时,可以也可以使用$('#selector').listbox('methodName',arguments)方式,例:
$('#btnCallMethod').click(function () {
var a = $('#left a:first');
if (a.size() > 0) {
var data = $('#left').listbox('getData', a);
alert("{value: '" + data.value + "', text: '" + data.text + "'}");
}
});
OK,至此我的需求基本满足了,就先这样吧,欢迎在试用过程中提交bug或者改进建议,谢了
源代码与示例下载(VS2010 ASP.NET MVC 3)
posted @ 2011-09-28 17:26 think8848 阅读(1332) 评论(2)
编辑

2011年9月18日
转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)
使用SqlCommand的感觉有时侯很爽,就跟那啥一样,对于数据的控制酣畅淋漓,但在这程中总是很担心一不小心打个颤,出现严重后果。之前在选择ORM时,选择了SubSonic,不觉已用了n年了,总的感觉来说还是非常不错的,但是SubSonic一直有一个硬伤:不能对同一个表进行JOIN连接。这个需求虽说不是天天有,但一个月总有那么几天需要去面对,搞的那几天人心情都不爽,当初选SubSonic是我力主的,解决不了问题,我难免得挨几下白眼。今天点低,又遇到了,需求很简单:一个Users中有ID,Name,SupervisorID三个列,SupervisorID为这个User的主管,很明显,这个查询很简单:
SELECT [Users].[ID],[Users].[Name],[Supervisors].[Name] AS [SupervisorName] FROM Users LEFT JOIN [Users] AS [Supervisors] ON [Users].[SupervisorID] = [Supervisors].[ID]
然而在SubSonic里不太简单了,最自然的写法为:
var query = new Select(/*Columns*/).From<User>()
.LeftOuterJoin<User>("SupervisorID","ID");
SubSonic生成的SQL为:
SELECT [Users].[ID], [Users].[Name], [Users].[SupervisorID] FROM INNER JOIN [Users] ON [Users].[SupervisorID] = [Users].[ID]
两个很离奇的结果,一个是在FROM后面居然没有表名,另一个是使用LeftOuterJoin方法,生成的居然是INNER JOIN?
于是使用LeftOuterJoin的另一个重载形式:
var provider = ProviderFactory.GetProvider();
var tbUsers = provider.FindOrCreateTable<User>();
var tbSupervisors = provider.FindOrCreateTable<User>();
var colSupervisorID = tbUsers.GetColumn("SupervisorID");
var colID = tbSupervisors.GetColumn("ID");
var query = new Select(/*Columns*/).From(tbUsers).LeftOuterJoin(colSupervisorID,colID);
这时SubSonic生成的SQL为:
SELECT [Users].[ID], [Users].[Name], [Users].[SupervisorID] FROM LEFT OUTER JOIN [Users] ON [Users].[SupervisorID] = [Users].[ID]
这次是LEFT OUTER JOIN了,但是FROM后面的表名还是没有,于是先查查在生成FROM时到底发生了什么
SubSonic.SqlGeneration.ANSISqlGenerator.cs
public virtual string GenerateFromList()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine();
sb.Append(this.sqlFragment.FROM);
bool isFirst = true;
foreach (ITable tbl in query.FromTables)
{
// EK: The line below is intentional. See: http://weblogs.asp.net/fbouma/archive/2009/06/25/linq-beware-of-the-access-to-modified-closure-demon.aspx
ITable table = tbl;
//Can't pop a table into the FROM list if it's also in a JOIN
if (!query.Joins.Any(x => x.FromColumn.Table.Name.Equals(table.Name, StringComparison.InvariantCultureIgnoreCase)))
{
if (!isFirst)
sb.Append(", ");
sb.Append(tbl.QualifiedName);
isFirst = false;
}
}
return sb.ToString();
}
原来它做了验证,如果FROM的表存在于将要JOIN的表中,则成生一个空字符串...
这样看来,SubSonic还真是没有提供这个功能了,现在的问题是,在SubSonic中添加这个功能的代价有多大呢,如果能轻量级(我喜欢轻量级)的解决这个问题还是值的动下手的。
先看看JOIN到底是怎么生成的:
SubSonic.SqlGeneration.ANSISqlGenerator.cs
public virtual string GenerateJoins()
{
StringBuilder sb = new StringBuilder();
if (query.Joins.Count > 0)
{
sb.AppendLine();
//build up the joins
foreach (Join j in query.Joins)
{
string joinType = Join.GetJoinTypeValue(this, j.Type);
string equality = " = ";
if (j.Type == Join.JoinType.NotEqual)
equality = " <> ";
sb.Append(joinType);
sb.Append(j.FromColumn.Table.QualifiedName);
if (j.Type != Join.JoinType.Cross)
{
sb.Append(" ON ");
sb.Append(j.ToColumn.QualifiedName);
sb.Append(equality);
sb.Append(j.FromColumn.QualifiedName);
}
}
}
return sb.ToString();
}
其中需要关注的是sb.Append(j.FromColumn.Table.QualifiedName);这句,SubSonic使用ITable的QualifiedName来生成JOIN后面的表名的,QualifiedName属性定义如下:
SubSonic.Schema.DatabaseTable.cs
public string QualifiedName
{
get { return Provider.QualifyTableName(this); }
}
SubSonic在需要表名的地方均使用了QualifiedName,在这种情况下,去修改QualifyTableName的值本身也不明智,而且这个有点“可恶”的是,定义个只读属性也就算了,居然值还是个方法的返回值,这种方式即使用反射也没有办法修改其值了,因此也就打消了在该属性动手脚的想法。到底该怎么办呢,手动添加一个Join吧,Join的实际上是一个IColumn,而IColumn的背后还站着一个ITable,看起来归根到底是需要生成一个ITable,而且这个ITable的名字不能和数据库中的表名相同(不然又被FROM给挡住了),最悲摧的是真实的表名还必须出现在SQL语句(有点废话)...
鉴于QualifiedName出现在多个地方,因此就使用QualifiedName作为别名吧,那么在sb.Append(j.FromColumn.Table.QualifiedName);这一行,QualifiedName肯定得换成诸如[XXX] AS QualifiedName之类的,只要动一行,就可以了。经过一番查看,发现DatabaseTable中的FriendlyName没有啥用,除了定义外没有发现任何地方有什么用,于是想出来一段代码:
public static SqlQuery SameTableJoin(this SqlQuery query, IColumn fromColumn, string toTableQualifiedName, Join.JoinType type, string toColumnName = "ID")
{
var provider = fromColumn.Provider;
var tmpTable = new DatabaseTable(toTableQualifiedName, provider);
tmpTable.FriendlyName = fromColumn.Table.Name;
var tmpCol = new DatabaseColumn(toColumnName, tmpTable);
query.Joins.Add(new Join(tmpCol, fromColumn, type));
if (!query.FromTables.Contains(tmpCol.Table))
{
query.FromTables.Add(tmpCol.Table);
}
return query;
}
FriendlyName是指定了,但是SubSonic并不知道我们用了这个属性啊,没办法,只有重载GenerateJoins方法了,在它里面使用FriendlyName,要达到非侵入目的,定义一个SqlServerProvider的派生类吧;
public class CleverSqlServerProvider : SqlServerProvider
{
public CleverSqlServerProvider(string connectionString, string providerName)
: base(connectionString, providerName)
{ }
public override ISqlGenerator GetSqlGenerator(SqlQuery query)
{
return new CleverSqlGenerator(query);
}
}
这个类其实还是没有做具体的SQL代码生成工作,还得定义一个SqlGenerator类:
public class CleverSqlGenerator : Sql2005Generator
{
public CleverSqlGenerator(SqlQuery query)
: base(query)
{
ClientName = "System.Data.SqlClient";
}
public override string GenerateJoins()
{
StringBuilder sb = new StringBuilder();
if (base.Query.Joins.Count > 0)
{
sb.AppendLine();
//build up the joins
foreach (Join j in base.Query.Joins)
{
string joinType = Join.GetJoinTypeValue(this, j.Type);
string equality = " = ";
if (j.Type == Join.JoinType.NotEqual)
equality = " <> ";
sb.Append(joinType);
sb.Append(string.IsNullOrEmpty(j.FromColumn.Table.FriendlyName) ? j.FromColumn.Table.QualifiedName : string.Format("[{0}] AS {1}", j.FromColumn.Table.FriendlyName, j.FromColumn.Table.QualifiedName));
if (j.Type != Join.JoinType.Cross)
{
sb.Append(" ON ");
sb.Append(j.ToColumn.QualifiedName);
sb.Append(equality);
sb.Append(j.FromColumn.QualifiedName);
}
}
}
return sb.ToString();
}
}
使用sb.Append(string.IsNullOrEmpty(j.FromColumn.Table.FriendlyName) ? j.FromColumn.Table.QualifiedName : string.Format("[{0}] AS {1}", j.FromColumn.Table.FriendlyName, j.FromColumn.Table.QualifiedName));一行,将FriendlyName应用了进去,现在唯一的问题是:如何使用CleverSqlServerProvider了,new一个吗?no no no,这个想都不要想,这是我不能容忍的,那种使用配置文件?好像还真没有发现该怎么配,再看看ProviderFactory类,发现一个有用的方法:
public static void Register(string providerName, Func<string, string, IDataProvider> factoryMethod)
{
if (_factories.ContainsKey(providerName))
{
_factories.Remove(providerName);
}
_factories.Add(providerName, factoryMethod);
}
这下有救了吧:)
使用SameTableJoin方法试试,看能不能生成想要的结果;
var provider = ProviderFactory.GetProvider();
var tbUser = provider.FindOrCreateTable<User>();
var colSupervisorID = tbUser.GetColumn("SupervisorID");
var query = new Select(/*Columns*/).From<User>()
.SameTableJoin(colSupervisorID, "Supervisors", Join.JoinType.LeftOuter);
看看生成的SQL:
SELECT [Users].[ID], [Users].[Name], [Supervisors].[Name] AS [SupervisorName] FROM [Users] LEFT OUTER JOIN [Users] AS [Supervisors] ON [Users].[SupervisorID] = [Supervisors].[ID]
OK,终于达到效果了,没有修改SubSonic的源码,但是达到了预期的目的。
写在后面的一句话,个人感觉,千万不要因为SubSonic这点瑕疵看不起它,总的来说,几年用下来还是觉得非常爽的,而且你也看到了,有了问题也很容易自已动手修补,我已经攒了不少这种扩展方法增强SubSonic的功能了。
posted @ 2011-09-18 18:03 think8848 阅读(53) 评论(0)
编辑

2011年9月14日
摘要: 转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)依照本人惯例,开篇先说些与主题无关的话:本来打算把写博客的这个习惯坚持下去,就算不能出精品,也能出一些水货,对于某些小问题提供点解决方案,但是今年的8月真可谓是多事之“秋”,很多事情都凑到一起去了,几乎没有时间学习新的东西,更别说去写博客了,9月眼看要过去一半了,昨天才憋出一个小东西,觉得还稍能滥竽充数下。打算用ASP.NET MVC实现公司的某产品了,昨天遇到一个问题:在异常发生时转回提交前的页面后,原来输入的内容不见了,这可是个大问题,记得以前我在写《ASP.NET MVC异常处理方案》一
阅读全文
posted @ 2011-09-14 13:22 think8848 阅读(113) 评论(0)
编辑

2011年7月24日
摘要: 今天继续调试WCF Web API源代码,方向是跟踪其单元测试,结果一上手就出了一个错误:HTTP could not register URL http://+:8000/testservice/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).经过一番好找,才知道是由于在Vista和Win7中的安全设置引起的,使用"netsh.exe"命令可以将http://+:8000/t
阅读全文
posted @ 2011-07-24 11:33 think8848 阅读(77) 评论(0)
编辑

2011年7月23日
摘要: 每隔几天,就会打开http://aspnet.codeplex.com去看看有什么动态,前两天无意间打开后发现了一个新东西,WCF Web API,本来我对WWW(WCF,WF,WPF)没有啥好印象,虽然在各大招聘网站上好像需求量倒不小,但是我发现这个Web API貌似是有关REST的内容,于是就多看了两眼,发现果不其然。不幸的是,现在Web API还是preview版本,文档少的可怜,只有源代码和一个几乎没有什么用的Sample,上网搜索也没有结果。前两天看到一句话,大概意思是:前两年大家都在考虑要不要REST,现在已经开始考虑如何REST了。尽管如些,但是在.NET平台上,REST好像还只
阅读全文
posted @ 2011-07-23 23:06 think8848 阅读(331) 评论(0)
编辑

2011年7月19日
摘要: 今天看到一个很好的ASP.NET MVC Razor使用jqGrid的示例,本文正是学习此示例中的一个功能。有关jqGridImport的文档,请参考这里jqGrid还有一个很有用的功能,可以导入和导出jqGrid的配置,这就意味着:使用c#的匿名类加上JsonResult(ASP.NET MVC)用C#的代码生成jqGrid,而不再使用js代码,很多人都怕写js,宁愿写两行C#都不愿意写一行js,这个功能对于不愿意写js的兄弟来说真是一个福音啊,天也不早了,直接上内容吧。Razor下View是这样写的@{ Layout = null;}<!DOCTYPE html><htm
阅读全文
posted @ 2011-07-19 00:27 think8848 阅读(308) 评论(0)
编辑

2011年7月18日
摘要: 今天发一个口水帖,刚才下载了别人的代码想看看,结果人家用了Northwind数据库,而我电脑上又没有,找了好一会儿才在M$的网站上找到,把脚本贴出来,以备不时之需,M$下载地址。Northwind:/*** Copyright Microsoft, Inc. 1994 - 2000** All Rights Reserved.*/SET NOCOUNT ONGOUSE masterGOif exists (select * from sysdatabases where name='Northwind') drop database NorthwindgoDECLARE @de
阅读全文
posted @ 2011-07-18 22:55 think8848 阅读(56) 评论(0)
编辑