這本書不錯,看了幾遍,每次都有新的收穫和體會。下面的幾點體會,錯誤和不當之處歡迎批評指正。
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,
在部署機器上執行安裝。