• 读书笔记 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,
    在部署机器上执行安装。

  • 相关阅读:
    <mvc:default-servlet-handler />说明
    sql server 数据库创建链接服务器访问另外一个sql server 数据库
    WebSocket实现简易聊天室
    WebSocket在建立连接时通过@PathParam获取页面传值
    Shiro密码处理
    Java enum应用小结
    Java8 Optional类使用小结
    Java中使用Jedis操作Redis
    前台图片Canvas压缩上传小结
    剪邮票
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/1683274.html
Copyright © 2020-2023  润新知