《ASP.NET 2.0编程珠玑》阅读笔记
1. ASP.NET 2.0向导实现为控件。要使用它们,只需要把一个新的向导控件添加到可视化设计器, 设置其属性即可。
2. Master Page可以为网站的多个页面开发出具有统一外观的操作方式的可视化模板。
3. 开发框架提倡使用基类继承的方式来建立页面。
4. 通过配置Web.config可以实现URL重写功能。URL重写就是接受带有有效命名编印定的URL,把它们转化为查询字符串,如:
http://www.someblogsite.com/username/?y=2005&m=01&d=31重写为
http://www.someblogsite.com/username/2005/January/31
需要的配置节如下:
<urlMappings enable=”true”>
<add url=”~/Articles/AspDotNet/UrlRewriting” mappedUrl=”~/Articles.aspx?cat=1&id=16”/>
<urlMappings>
5. VS2005中新增的“数据库项目”可以帮助开发人员组织数据库相关的脚本及查询语句,虽然不能够与其它代码项目相引用,但使用添加在版本服务上的脚本编写手段还是一个不错的选择。
6. “SQL Server项目”与“数据库项目”不同,其作用是在VS2005上使用托管代码开发SQL Server 2005数据库内容,包括存储过程、用户定义函数和用户定义类型。
7. “主题”与“皮肤”比直接使用CSS样式表更加强大,因为它不但可以控制控件的外观,还可以控制控件的部分行为。
8. 在团队开发过程中,可能不同的团队成员需要具有不同的Web.config内容,这使得文件的签入签出变得比较麻烦,甚至各个成员在修改各自的Web.config内容时会取代其它人的配置,此时可以使用外部文件的方式来处理,类似于Include功能,如:
<appSettings file=”../localhost.config”>
9. 在VS2005中大量使用了“提供程序”的设计模式,列表如下:
Membership:管理用户,在System.Web.Security命名安全操作空间中有两个提供程序:SqlMembershipProvider和ActiveDirectoryMembershipProvider
Role:管理与用户相关的角色,在System.WebSecurity命名空间中有三个内置的提供程序:AuthorizationStoreRoleProvider、SqlRoleProvider和WeindowsTokenRoleProvider
Site Map:用于填充站点地图控件,只有一个内置的提供程序:System.Web.XmlSiteMapProvider
Session State:可以管理站点用户的会话状态——提供程序匹配和提供的功能类似于ASP.NET1.1。但是,现在用户可以扩展它,或用自己的会话状态提供程序来替代它。会话状态提供程序位于System.Web.SessionState命名空间中,InProcSessionStateStore、OutOfProcSessionStateStore和SqlSessionStateStore实现会话状态提供程序。
Profile:System.WebProfileSqlProfileProvider提供了一种SQL Server实现方式,来存储用户配置项。将来的配置提供程序可以把正常的数据库表映射为配置项。
Web Event:Web事件提供程序可以扩展或发布Web事件,它位于System.Web。Managerment命名空间。下面是内置的提供程序:EventLogWebEventProvider、SimpleMailWebEventProfier、TemplateMailWebEventProvider、SqlWebEventProvider、TraceWebEventProvider和WmiWebEventProvider
Web Part Personalization:为Web part保存位置和其它个性化选项,Web part位于System.Web.UI.WebControls.WebParts命名空间,SqlPersonalalizationProvider是其唯一的内置提供程序。
Protected Configration:在应用程序配置文件中提供各个配置段的保护,有两个内置的提供程序:DPAPIProtectedConfigrationProvider和RSAProtectedConfigrationProvider
在提供程序上需要理解的重点在于如何扩展自己的提供程序,使用服务端的内部组件使用我们自己的提供程序来工作。
此外,提供程序这种设计模式也是在有些需要高度灵活的系统设计中可以借荐的。
10. AJAX的概念已经不是新事物了,但使用AJAX比较复杂,所以使用一些成熟的开发架构(控件)能够达到事半功倍的效果,其中包括:微软的技术团队所推出的Atlas、Web.UI 2.0(ComponetArt)、Infragistics 2007等
11. 对于页面中一些较简单的加调处理,可以通过ASP.NET 2.0自带的ICallbackEventHankler接口来实现无刷新技术,如:
public partial class Default8 : System.Web.UI.Page, ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
string src = this.ClientScript.GetCallbackEventReference(this, "arg", "ClientCallback", "ctx", "ClientErrorCallback", false);
string mainSrc = @"function TestFun(arg, ctx){" + src + ";}";
this.ClientScript.RegisterClientScriptBlock(this.GetType(), "TestFun", mainSrc, true);
if (this.IsPostBack) return;
this.Button1.Attributes.Add("onclick", "TestFun(5,5);return true;");
}
#region ICallbackEventHandler 成员
private string _result = string.Empty;
public string GetCallbackResult()
{
return this._result;
}
public void RaiseCallbackEvent(string eventArgument)
{
this._result = "Raised";
}
#endregion
protected void Button1_Click(object sender, EventArgs e)
{
this.Response.Write(DateTime.Now.ToString());
}
}
12. 在VS中调试代码时,可视化器的技术很常强大,可以通过可视化的窗口动态监视对象中的数据变化,系统提供了一些常用的可视化器,我们也可以制作自己的可视化器,只需要建立一个窗口使其继承 Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer 类 ,并指定该类作为某种类型的可视化器:
[assembly:System.Diagnostics.DebuggerVisualizer(typeof(XXXXX.XXXX), Target=typeof(XXXX), Description=”Image Visualizer”)]
最后,将包含可视化器窗口的项目编译为类库,放置在VS2005安装目录下的Visualizers目录下。
13. 通过指定对象成员的附加属性,可以控件该成员在调试时是否可见,指定的属性为:
[DebuggerBrowsable(DebuggerBrosableState.Collapsed)]
还可以通过类型代理简化对象的调试视图,方法是制作一个类,将其作为目标类的内置类,并通过附加属性指定其代理输出目标类的调试信息,不过这种试较为繁琐,需要增加额外的工作量,只有在大型项目中需要用到的时候才有使用价值。
14. 在VS2003中,制作自定义控件一般使其继承自WebControl类,现在VS2005中提供了一个新的基类给我们,便于我们封装继承,它就是“CompositeControl”类。
15. RSS技术能否应用到软件项目中?能否使用它来做内容列表?结合智能客户端可能更具有使用价值。这项技术有待于进一步研究。
16. Xml技术在VS2005中也做了增强,除了有专门的Xml控件外,系统还提供了一个功能完备的System.xml命名空间,有时间的话还是要研究一下,毕竟Xml作为数据传输的跨平台手段是非常好的。
17. HttpContext中的Cache技术是很早就有的了,可是好像很少会去用它,书上说,“缓存有总比没有好,哪怕只是缓存5秒种,那也会大大降低服务器的负担”。想想还是有道理的。
18. 定制控件开发中有很多技术需要学习,如定义类型转换器在某个属性的类型与文本之间进行转换、生成VS2005中的控件动作列表(就是选中控件后出现在控件小箭头下的东西)、制作属性编辑器、设计期间与运行期间的不同处理、以及VS2005开发平台的对象模式(就是调用VS2005自身的插件接口)。
19. 在VS2005中新增了几个DataSource控件,个人认为SqlDataSource与AccessDataSource在开发软件项目时并没有什么实用价格,毕竟使用它们就违反了分层架构。
而ObjectDataSource却可以作为实体类与页面显示之间的一个桥梁,用它可以实现在页面上显示实体类列表的功能,不但如此,而且ObjectDataSource控件支持缓存、支持多种的参数传递,我们也可以继承它派生出我们自己的针对于某种实体类的DataSource,来增强其业务逻辑控件,看上去是一个非常好的东西,但有两点不能不引起我们的注意:
一是与GridView控件结合使用显示列表时,我们的列表通常不只是一张表的内容,实体类中可能会存在一些属性是调用其它业务逻辑或从数据库中二次查询出来的,如果使用ObjectDataSource绑定到了GridView列出时,就可能会发生在显示的每一行对象上,有部分属性需要再次访问数据库查询获得,这种情况会大大降低页面的显示速度,比起通过数据库视图查询出DataSet直接绑定要慢得多。
二是与DetailsView控件结合使用时,DetailsView控件生成的内容不太好控制,虽说可以使用模板来定义每个对象元素的显示及输入方式,但比直接开发页面还要复杂一些,更不要说处理数据的前/后验证了。我觉得DetailsView控件就像Login控件一样,只是一个表面上的强大,并不能给我们严谨的软件开发带来多大的效率提升。
所以,我只会把ObjectDataSource当作是显示实体类列表的手段之一,使用它的时候必须考虑到实体类成员在显示的时候它的执行速度问题。
此外,XmlDataSource作为处理Xml文件则是个不错的选择。
20. ViewState可以作为存储页面附加数据的一种途径,但为了减小ViewState的大小,也可以使用HideField来存储。同时可以使用压缩手段,在重写ViewState的保存与加载方法中对ViewState进行压缩。
21. VS2005支持代码片断、文件模板、项目模板,值得关注一下,来提高程序开发的效率。
22. Master Page中的资源地址应该使用应用程序级绝对路径(~/。。。。)。
23. 通过Master.Page.Header可以修改MasterPage(或页面)的头信息。前提是HTML中的head必须标记为runat=”server”。
24. 使用Master.Page.Form.FindControl可以获取模板面上的控件,以便于控制它们。但更好的方法是在MasterPage中使用属性公开一个控件。
25. 使用页面指定“MasterType”指定“TypeName”或者“VirtualPath”属性可以强类型关系模板面。
26. Master Page支持嵌套模板面。但在VS2005中不支持所见即所得的设计模式。
27. 可以通过发布为GAC(公共程序集)的方式可以在多个应用程序间共享模板面或用户控件,但比较繁琐,这里略过。
28. 在页面的PreInit事件中可以通过masterPageFile重新设置模板面的地址,来实现动态修改页面布局的功能。
29. 通过扩展使用HttpModule与HttpHandler可以实现高度的自定功能,例如IP阻止、重定向等等。