讀書筆記 ASP.NET 2.0編程珠璣

來源:互聯網
上載者:User

這本書不錯,看了幾遍,每次都有新的收穫和體會。下面的幾點體會,錯誤和不當之處歡迎批評指正。
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  用戶端回調
截張圖看看用戶端回調的原理
 
具體代碼例子網上已經很多。

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)

如,這是字串的可視化器, 
這個功能在調試拼接SQL語句的代碼字串是非常有用,直接從這裡拷貝到字串代碼到查詢分析器中,即可驗證SQL語句是否正確。
還在DataSet Visualizer,可方便的查看一個DataSet的表結構和資料。
另外的兩項技巧,沒有用過。感覺調試個項目還要寫那些代碼,不方便。

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

7  ViewState
先看圖,加深印象

網上有一條名言:禁止在頁面中使用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的錯誤之處。
My Code產生器的折衷的辦法是,可以同時產生拼接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,
在部署機器上執行安裝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.