读书笔记 ASP.NET 2.0编程珠玑

这本书不错,看了几遍,每次都有新的收获和体会。下面的几点体会,错误和不当之处欢迎批评指正。
1  使用Page基类
public class BaseUIPage : System.Web.UI.Page
{
public BaseUIPage()
    {    }
}
使用页面基类,可减少代码重复。比如,重写错误处理方法,共用基类属性。
我举两个例子
1)重写OnError方法,当出现错误时,重定向到错误页面。
protected override void OnError(EventArgs e)
   {
       Server.Transfer("~/Error.aspx");
   }
新建一个页面,继承自BaseUIPage,在代码中故意制造一个错误
throw new ApplicationException(); 或 int a = 0;  int b = 3; a = b / a;
2)举一个权限系统的例子
[Actions(Permission.Read)]
public partial class QuotaReivewReport : BaseUIPage
{
      public QuotaReivewReport() : base(SystemModule.ReportPageBase) { } 
}
在基类BaseUIPage中,检查当前用户的角色权限列表,是否包含执行当前页面(QuotaReivewReport )需要的权限(Permission.Read),如果不包含,则跳到错误页面。

2  Web配置
这些设置存储在一个外部文件中,用户把这个外部文件保存在本地。在web.config中使用适当的引用来包含这些文件,比如 Web.config中
<appSettings file="localhost.config">
localhost.config 文件内容
<appSettings>
<add key="DefaultDaysLate" value="7" />
</appSettings>
自己业余时间折腾了一个权限管理系统,每次新建一个项目时,总需要拷贝一些配置到新项目的Web.config文件中。有了这项特性,现在只需要拷贝我配置好的Permission.config文件到新项目的根目录下,然后在Web.config中指定文件名即可,大大减少出错的机率。
还有连接字符串,也可以实现同样的设置方法。在Web.config中
<connectionStrings configSource="localhostConnectionStrings.config"/>
localhostConnectionStrings.config外部文件的内容
<connectionStrings >
<add name="MyDB" connectionString="server=myServer;uid=myuser;password=***;database=MyDB" />
</connectionStrings>
在网站运行时,如果修改 Web.Config 文件会引起站点的重启,而修改 localhostConnectionStrings.config 文件则不会引起网站重启。可读性也好。
联想到WCF的配置,也是比较麻烦的设置。也打算做成这样的引用外部文件的方式,可惜WCF的配置上不支持configSource,使用WCF自定义配置文件,需要重写相关的方法才行。

3   导出模板
导出模板,在以后创建新项目或已有项目中的新项时使用。使用这个向导可以创建模板,用于整个项目或项目中的某个项。
通常一个项目有一些共同基类,这项特性可以把基类做成模板,在新建Item时,选择相应的模板即可。

4  客户端回调
截张图看看客户端回调的原理
image 
具体代码例子网上已经很多。

5   AJAX不仅仅是一个客户端脚本库
AJAX控件工具箱
Timer ,定时执行方法。这个需要Page类作为容器才行。如果没有Page容器,可选择System.Timers.Timer.
UpdatePanel 定义与服务器进行异步刷新的容器控件,用的最多。注意页面中要放ScriptManager控件,此外,FileUpload,Menu控件不支持在UpdatePanel中异步刷新。
Auto Complete 自动完成
<ajax:AutoCompleteProperties TargetControlID="stateTextBox" Enabled="true" ServicePath="StateListWS.asmx"  ServiceMethod="GetMatchingStates" />
调用后置代码中的如下方法
[WebMethod]
public string[] GetMatchingStates(string prefixText,int count)
{
}
在浏览器上使用服务,用JavaScript调用Web服务,比原生的直接用JavaScript的方式代码要简洁很多
<ajax:ScriptManager ID="ScriptManager1" runat="server">
<Services><ajax:ServiceReference Path="MapLocFormatter.asmx" /></Services>
</ajax:ScriptManager>
JavaScript扩展,如下的代码所示,使用JavaScript创建面向对象的类型
Type.registerNamespace("MVPHacks");

6 可视化器(Visualizer)
image

如上图,这是字符串的可视化器, 
这个功能在调试拼接SQL语句的代码字符串是非常有用,直接从这里拷贝到字符串代码到查询分析器中,即可验证SQL语句是否正确。
还在DataSet Visualizer,可方便的查看一个DataSet的表结构和数据。
另外的两项技巧,没有用过。感觉调试个项目还要写那些代码,不方便。

[DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]
public List<Person> Children
{  
get{return _children;}
}
或创建代理类
[DebuggerTypeProxy(typeof(PersonProxy))]
class Person {            }

7  ViewState
先看图,加深印象
image
网上有一条名言:禁止在页面中使用static变量
要保存当前用户操作的状态,比如更新动作或是新建功作,用ViewState。
网上还有高人,超级简单:巧用ViewState属性
活学活用特性的知识,通过在页面的属性中声明一个特性,使之成为ViewState。
[ViewStateProperty("UserID")]
protected int ViewState_UserID { get; set;}
或者
[ViewStateProperty]
protected int ViewState_UserID { get; set;}
改善ViewState性能, ASP.NET 2.0中通过压缩ViewState改善性能
改变ViewState的存储位置,重写ViewState的存储目的地,以提高页面性能

8  IN表达式的参数化
为了让IN支持参数,需要写一个函数解析这个参数,分解成逗号分隔的字符串或数值。
SELECT EmployeeID, LastName FROM Employees 
WHERE EmployeeID IN (@list)

避免SQL注入攻击的办法是过滤用户输入的字符串,比如逗号要换成双引号,检查SQL关键字。
比较好的办法是用查询参数,虽然调试起来麻烦一些,不容易找到SQL的错误之处。
我的代码生成器的折衷的办法是,可以同时生成拼接SQL语句和查询参数的DAL代码,一般都用查询参数的DAL代码,如果有必要调试最终的SQL语句就用拼接的SQL语句DAL,调试完成后还是改成查询参数的DAL代码。

9  ASP.NET页面中使用RDLC报表控件
Web.config中添加引用
<add tagPrefix="rsweb" namespace="Microsoft.Reporting.WebForms" assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
页面中拖一个控件
<rsweb:ReportViewer ID="rpt" runat="server" Width="100%" Height="400px"
                        Font-Names="Verdana" Font-Size="8pt">
                        <LocalReport>
                            <DataSources>
                            </DataSources>
                        </LocalReport>
    </rsweb:ReportViewer>
后置代码
rpt.LocalReport.ReportPath = AppDomain.CurrentDomain.BaseDirectory + "/Report/Report.rdlc";
  string project = ddlProject.SelectedValue;
  DataTable tbl = ReportDAL.GetReport(project);
  if (tbl != null)
       {
          rpt.LocalReport.DataSources.Clear();
          rpt.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("Report", tbl));
            rpt.LocalReport.Refresh();
   }
         rpt.LocalReport.Refresh();
}
部署的时候比水晶报表容易很多,如果有问题,可以到VS IDE的安装目录中去找到ReportViewer.exe,
在部署机器上执行安装。

原文地址:https://www.cnblogs.com/JamesLi2015/p/1683274.html