1.当session获取不到值得时候,我们需要让用户重新登录,这时候就需要调转到登陆页,因为我的大部分方法是写在异步处理程序中的,不方便在后台进行判断,而在一般处理程序中做判断的时候,当session为null时,虽然也执行了跳转页语句,但是界面上是没有什么变化的,最后将判断session是否存在的方法写在了js中,其他方法只要调用这个方法就可以了。方法如下:
function checkSession(){
var val = "<%= Session["UnitsID"]==null?"":Session["UnitsID"]%>";
if (val == null||val=="") {
//location ="../../Login.aspx";
//location.href ="../../Login.aspx";
//window.location.href ="../../Login.aspx";
//opener.document.location.href= "../../Login.aspx";
//以上四种方法跳转页时都会出现在框架外
open("../../Login.aspx", "_parent", true);//跳转页在框架呢
}
}
对于以上方法中的两种效果如下:
a.跳转页在框架中:
个人认为这种效果很难看,估计用户使用的时候应该也会费解吧,不过这也要看用户的需要和审美了吧
b.跳转页不在框架中:
个人认为这种效果比较不错,说明(这两种效果登陆之后的界面是一样的)
2.在一个框架中,点击左侧的菜单项时,右侧需要根据菜单内容出现一个界面,这时候咱们当然是不想让它逃出这个框架了,方法如下:
<li><a href="test.aspx" target="main">菜单项</a></li>
说明:main为右侧框架的名字,这样他就会老老实实的呆在框架中了
下面是target的属性值的解释,详细见:html中target属性
3.当我们需要根据索引值获取节点的时候,一定要多多注意,火狐与其他浏览器的值不一样,开始我不知道这一点,在火狐上调试好了,结果换了浏览器就找不到了,乱猜导致这种现象的原因,用了不到一个小时,最后才发现原来索引变了,在这说这个的原因就是给大家提个醒,出现这种情况后一定要想想这个啊.没有找到一个很好的解决办法,只是采用了其他方式来避免了这个问题,如果大家有好的办法,一定要记得分享啊
4.text-align:center,这一属性在IE6,IE7中可以使块级元素居中对齐。其他浏览器中,text-align:center仅作用于行内内容上,解决这个问题比较好的方式,就是为所有需要相对父容器居中对齐的块级元素设置“margin-left:auto; margin-right:auto”。但这个方式IE6,IE7中不支持,所以还要设置父容器的 "text-align:center;"。若居中对齐的子元素内的行内内容不需要居中对齐,则还需要为其设置“text-align:left”
5.唐欢讲数据库优化之后对处理大数据的语句进行的修改
--之前的not in
select CadresName,Position,Unit FROMV_InquireCadresData where Name= '市直单位'and Checked='Yes' and
CadresID not in(select CadresID fromV_InquireCadresDataed where Name='市直单位'and YearTime='2014' )
--之后的left join
select A.CadresID,CadresName,Position,UnitFROM V_InquireCadresData AS A left join (select CadresID from V_InquireCadresDataed where Name='市直单位'andYearTime='2014'and Unit='市环保局' ) as B on A.CadresID=B.CadresID where B.CadresID is null and A.Checked='Yes' and Name='市直单位'and Unit= '市环保局'
做了这样的改进之后,效率提高了很多,同时在这次合作中还学到了这么一条语句, SELECT name, id From sysobjects WHERE xtype = 'u' ORDER BY name ASC是用来查询sqlserver中数据库的所有表的字段的(此例以字段name,id为例)
6.那天在米老师那聊天说到分支多的情况下能用switch ,case就别用if语句,最好使用设计模式——策略模式,说到这想了想好像自己平时并没怎么注意到这一点,赶紧回来了解
switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对 应索引号的表项从而到达定位分支的目的,不过,switch...case 只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1&& a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比if…else效率高,但是if…else能应用于更多的场合,比较灵活,选择哪一种方式还是需要联系实际的,单纯的考虑效率,你可以做个实验自己测试一下,下面是我看了艳玲师姐测试时间的博客后, 写的一个超级简单的测试程序。
Switch…case方式
protectedvoid Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Stopwatch stopwatch = newSystem.Diagnostics.Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
int a = 6;
int b;
int count = 10000;//int count = 100000000;
for (int i = 0; i < count; i++)
{
switch (a)
{
case 1:
b = 1;
break;
case 2:
b = 2;
break;
case 3:
b = 3;
break;
case 4:
b = 4;
break;
case 5:
b = 5;
break;
case 6:
b = 6;
break;
}
}
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double minutes = timespan.TotalMinutes; // 总分钟…
}
count = 10000时;
count = 100000000时;
If… else方式
protected void Page_Load(object sender,EventArgs e)
{
System.Diagnostics.Stopwatch stopwatch = newSystem.Diagnostics.Stopwatch();
stopwatch.Start(); // 开始监视代码运行时间
int a = 6;
int b;
int count = 10000;
//int count = 100000000;
for (int i = 0; i < count; i++)
{
if (a == 1)
{
b = 1;
}
else if (a == 2)
{
b = 2;
}
else if (a == 3)
{
b = 3;
}
else if (a == 4)
{
b = 4;
}
else if (a == 5)
{
b = 5;
}
else if (a == 6)
{
b = 6;
}
}
stopwatch.Stop(); // 停止监视
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
double minutes = timespan.TotalMinutes; // 总分钟…
}
count = 10000时;
count = 100000000时;
对比之后相差不是很大,但是你有没有想过这只是一个测试代码而已,没有参杂着更多的元素.如果把它用到逻辑性很强的代码中呢?所以说用什么还是需要考虑需求的,再嵌套一层会怎样?有兴趣的可以去试试,不过一定要写一套等价的代码啊.
7.至于策略模,当一个对象有很多的行为,我们往往会想到用多重的条件语句来实现,虽然能实现,但是如果又来了好几个行为你怎么办,再原来的基础上继续加分支?这样当然可以实现,不过这样设计太过依赖对象了,此时,使用策略模式,把这些行为转移到相应的具体策略类里面,行为的增,减也就不会直接影响到对象,它是依赖接口的,也就可以避免使用难以维护的多重条件选择语句了;这种情况只是你考虑选择使用策略模式的情况之一,可能一说起策略模式大多数人首先会想到算法,不错,策略模式将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,策略模式被很多人称为"可插入式的算法" .
以上是在项目过程中的一些问题的记录,如果有什么地方理解有误,希望得到大家的纠正.