webfrom 总结
网上看了很多理论,然而知易行难。在实际工作中还是存在很多问题。
下面是使用webform过程中的总结。
1.不使用服务端控件
表单有post和get两种方法,可以通过 form methed='post/get' action='login.aspx'的方式将表单的形式直接提交到动态页面。
但是碰到要回传的页面 我现在还是要依赖 botton控件。
还有一种是用ajax调用后台文件,但是这样在html提交到一般处理程序和webservice就够了,不需要.aspx页面。
研究了下.net的回传机制,没有理解清楚。
想起了mvc模式,才明白为什么webform大家都不用了,跟ajax配合太好用了。以后看有没有机会用mvc重写一次,现在用的三层,应该重写ui层就可以了吧。
2.SqlCommand需要using吗
用了using 不用 cmd.Parameters.Clear();
没有add parameter可以不要using。
关于using(百度的)
一般支持Dispose()方法的类型的对象,都可以被using起来。
using(A a = new A())
{
}
代表a这个对象的生存期仅仅在两个花括号之间,出了这个括号就会销毁。
为了支持自动销毁,所以需要有Dispose方法。
3.iis的托管管道模式
经典模式和集成模式
区别:1.上述两种管道模式使用的web.config文件存在重大的区别,许多在经典管道模式下能够正常工作的web.config文件都无法在集成管道模式下正常工作。
据说 利用AppCmd.exe,我们可以将经典管道模式下的配置文件格式自动转换为集成管道模式下的配置文件格式。暂时还没搞懂,先记下来。
2.经典模式缺少许多集成模式才能提供的特性。
3.在集成模式中,httpmodule模块和httphandler不再定义于<system.web>中,而是定义于<system.webServer>中。
4.url重写
http://www.cnblogs.com/knowledgesea/archive/2012/10/08/2715350.html
iis配置错误请参照第二条
5.handler的应用
1)图片防盗链 2)写验证码
具体实现,网上有很多,我就不复制粘贴了。现在我的验证码还是用的aspx页面做的,因为用起方便写。
6.model层的意义
1)感觉意义就是 三层之间要传递数据库中的数据,增删改查都需要传递各种不同的参数 ul->bll->dal 都需要定义很多参数,有model层后,就只用传递一个model就行了。
2)如果性别在数据库中表示的0,1,可以在model层中新增一个属性用get方法转化为 男,女 再传递到ui层显示。因为赋值都是在构造函数,所用用了只读属性
private string _sex; public string Sex{ get{return _sex;} } public string SexShow{ get{ return _sex=="0"?"男":"女"} }
7.Cache
学习中。。。
http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html
暂时用不到,中断中。。。
8.异常总结
1)null值的处理
容易存在null值的地方:request获得的数据 request.querystring[] request.form[] ..., sql查询结果
调用前应该判断null值的地方:.tostring() , .length
string 类型null值和""的判断方法 !String.IsNullOrEmpty(someString)
思考:为什么null.tostring()会报错,string a=null,表示a 未实例化,null.tostring()报错是因为,一个不存在的东西没有tostring()方法。
2)另一个 SqlParameterCollection 中已包含 SqlParameter。
异常分析:1、在方法外定义了 sqlparameter,而调用sqlhelper时不是new 了一个 sqlparameter,而是直接对sqlparameter赋值后传入。造成每一次cmd.parameter.add()都是添加的同一参数
2、sqlhelper第一次执行后,垃圾回收机制尚未未将cmd释放,在第二次调用时又新增了一个cmd,出现异常 两个cmd同时引用同一个sqlparameter。
解决方法,针对第一步,每次new一个sqlparameter。针对第二部,cmd每次使用完将参数释放掉。cmd.Parameters.Clear();
9.更高的性能
1).使用List类
如果我们只是遍历List容器中的所有内容的话,那么,使用IEnumerable接口会更好一些。因为函数参数传递一个List对象要比一个IEnumerable接口要花费更多的开销。
public void SomeMethod(IEnumerable<SomeItem> items) { foreach(var item in items) { // do something with the item… } }
2)直接使用数字
为什么不给你的这些数字取个名字呢?比如使用Enumerations。
public enum SomeEnumerator { DefaultMode = 1, SafeMode = 2, NormalMode = 3 } if(mode == SomeEnumerator.DefaultMode) { … } else if(mode == SomeEnumerator.SafeMode) { … } else if(mode == SomeEnumerator.NormalMode) { … }
说明:当需要在数据库中存 汽车类别时,可以存int类型,在程序中定义枚举
public enum CarCategory{ qiche=0, jiaoche=1, huoce=2 }
但是最近model层我比较喜欢直接全部用string类型做变量类型,而枚举好像是对应 int 类型,所以平时我也没有用 枚举,有空要研究下枚举的类型转换。
该条见:http://coolshell.cn/articles/1375.html
2)先执行父类的构造函数-子类的构造函数-父类的方法
11、session
在webform和mvc类库外使用session需要实现接口IRequiresSessionState
未完待续