asp.net開發要注意的是?
TRANSCRIPT
2
Outline• ASP.NET 開發要注意的是 ?(ASP.NET 2.0 以上 )• 基本篇
• 設定 TextBox Focus 、 Default Button 、驗証• GridView 篇
• GridView 分頁、資料分頁、取得選取列的 Key 值…• 狀態篇
• ViewState• 特殊篇
• 動態加入控制項、先回 Server 檢查、 HttpHandler• 上線篇
• 客製化、設定 Release 模式、維護• IIS 篇
• 查看目前的要求、設定 IIS Log 的欄位、讀取 IIS Log 的資訊…
3
基本篇• 設定 TextBox Focus• 設定預設 Button• 必填欄位驗證• 檢查行動裝置
4
Page 上預設 Focus 的 TextBox 在那裡呢 ?• 可透過以下方式來設定 Focus
DefaultFocusTextBox.Focus();
Page.SetFocus(DefaultFocusTextBox);Page.SetFocus(DefaultFocusTextBox.ClientID);
form1.DefaultFocus = DefaultFocusTextBox.ClientID;
5
如何設定預設的 Button?• 設定 form or panel 的 DefaultButton 屬性
form1.DefaultButton = Button1.UniqueID;
panel1.DefaultButton = Button1.UniqueID;
6
顯示完必輸欄位後,為何沒有 Focus 呢 ?• 設定 RequiredFieldValidator 的 SetFocusOnError = “True”
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"ErrorMessage="TextBox3 一定要輸入哦 " ControlToValidate="TextBox3"SetFocusOnError=“True" />
7
動態設定必填欄位需要 Postback 嗎 ?
AutoPostBack="True" OnCheckedChanged=“event“
vldWay_1.Enabled = chkWay_1.Checked;
8
動態設定必填欄位需要 Postback 嗎 ?(cont..)• $(document).read, checkBox 變動時• 設定必填欄位啟用與否
ValidatorEnable(ValidatorControl, true/false);
ValidatorEnable(txtWay_2_Validator, chkWay_2.checked);
9
檢查是否為行動裝置• Request.Browser.IsMobileDevice
protected void Page_Load(object sender, EventArgs e){ if (Request.Browser.IsMobileDevice) { Response.Redirec("~/default_mobile.aspx"); }} Lookup: C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers
Other Info:ASP.NET Mobile Device Detection
10
GridView 篇• GridView 分頁• 資料分頁• 取得選取列的 Key 值• ClientIdMode• …
11
請做有分頁的 GridView• GridView• AllowPaging="True“• OnPageIndexChanging="GridView1_PageIndexChanging“
• GridView1.PageIndex = e.NewPageIndex;
<asp:GridView ID="GridView1" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging“ ….
GridView1.DataSource = mydataSource;GridView1.DataBind();
12
如果資料量很大,要如何處理呢 ?• GridView• AllowPaging="True“• DataSourceID="odsGridView"
• ObjectDataSource• EnablePaging="True“• OnSelecting="odsGridView_Selecting“• MaximumRowsParameterName="pageSize" • StartRowIndexParameterName="startIndex"• TypeName="MyProduct.BO.Person“• SelectMethod="GetPersonsPaging"• SelectCountMethod="GetSelectedCount"
13
如果資料量很大,要如何處理呢 ? (cont..)• Nbase20 搭配 SQL usp_paging(Store Procedure) 來做資料分頁
EXEC('DECLARE @StartRow int, @EndRow intSET @StartRow = ' + @strStartRow + 'SET @EndRow = ' + @strEndRow + 'SELECT PG2.* FROM ( SELECT ROW_NUMBER() OVER( ' + @strORDER + ') AS RowNum, PG.* FROM (' + @strSQL + ') PG ) PG2' + ' WHERE PG2.RowNum > @StartRow AND PG2.RowNum <= @EndRow ' + @strORDER)
14
如何取得 GridView 選取列的資訊 ? • 在 GridView 上的 Button 在 RowCommand Event 中• CommandArgument 屬性
• 取得 RowIndex ,透過 RowIndex 來取得 DataKeys
string key = e.CommandArgument.ToString();
int index = ((GridViewRow)((Button)e.CommandSource).NamingContainer).RowIndex;string dataKey = GridView1.DataKeys[index].Value.ToString();
15
如何取得 GridView 選取列的資訊 ? (cont..)
• 透過 GridViewRow ,利用 FindControl 來取得Control lblKey = ((GridViewRow)((Button)e.CommandSource).NamingContainer).FindControlRecurive("labelName");if (!lblKey.IsNull()){
string dataKey2 = (lblKey as Label).Text;}
16
Postback 後可以不要每次都要 Scroll 嗎 ?• MaintainScrollPositionOnPostback = “true”
<%@ Page MaintainScrollPositionOnPostback="true“ …
<pages maintainScrollPositionOnPostBack="true“ …
17
ClientIDModeASP.NET 4.0值 說明Inherit 繼承父控制項的 ID 產生機制AutoID 與之前版本相同的用戶端 ID 產生方式Predictable 透過一個確定的機制來產生用戶端的 ID
通常與父控制項 ClientIDRowSuffix 配合Static 與伺服端指定的 ID 相同
18
19
可以暫時停止 Ajax?• 使用 Ajax (ScriptManager + UpdatePanel)• 有錯誤時如果不好查,可設定 ScriptManager
EnablePartialRendering=“False"
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering=“False" ...
20
狀態篇• ViewState
21
ViewState Size 太肥問題• 用內建的 SessionPageStatePersister 取代預設的
HiddenFieldPageStatePersister
• 用 3Party 元件• Flesk.ViewStateOptimizer ( 壓縮後再存 )
protected override PageStatePersister PageStatePersister{
get{
return new SessionPageStatePersister(this);}
}
22
ViewState 放到了 Session Hidden 欄位為何還有資料呢 ?• 因為有些資料是放在 ControlState 之中
<system.web><browserCaps> <case>RequiresControlStateInSession=true</case></browserCaps>
</system.web>
23
特殊篇• 動態加入控制項• 按 Button 時可以先回 Server 檢查後,再問 User 要不要做• HttpHandler
24
動態加入控制項的時機
25
動態加入控制項的時機 (cont..)• Page_Init 、 Page_Load Event• 每次都要加入• !IsPostBack 設定初始值• 用 AddAt ,要在 Page_init
TextBox tb = new TextBox();tb.ID = "DynamicAddTextBox";holderTextBox.Controls.Add(tb);if (!IsPostBack){
tb.Text = "Init Value";tb.BackColor = Color.Red;
}
26
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ?
27
• 在 Button 的 Click 中判斷,然後再 Render JS 問 User 後,再Postback 一次
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ? Postback 2 次...btnPostbackTwice_OnClick(object s, EventArgs e){
...RegisterStartupScript( .... "if(confirm(' 警告 ! 是否要submit?')){window.setTimeout('__doPostBack(\"\", \"ProcbtnRun\");', 500, 'Javascript')};" }
28
• Page_Load 時判斷是不是真的要處理
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ? Postback 2 次if (Page.IsPostBack){
// 判斷是不是按下確認回來的if (Request.Form["__EVENTARGUMENT"] == "ProcbtnRun")
ProcessConfirm();}
29
• Page 要實作 ICallbackEventHandler • Button 的 OnClientClick = ClientScript.GetCallbackEventReference 等等一堆 JS 去串起來• 在 ICallbackEventHandler.RaiseCallbackEvent 中處理 Logic• 在 ICallbackEventHandler.GetCallbackResult() 回傳判斷結果• Button 的 OnClick 寫實際要執行的事• Client 端還要覆寫原生的 WebForm_DoCallback Method ( 有 Bug)
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ? Callback
<input type="submit" onclick="WebForm_DoCallback('__Page','RunCallback',btnCallBack_CallbackHandler,"",null,false); return false;" ..
30
• 做一個 Web Service 、 Page Method or Web API …• ClientClick 使用 XMLHttpSyncExecutor( 可從網路上 download)• Button 的 OnClick 寫實際要執行的事
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ? 同步 Call WS
<asp:Button ID="btnCallWS" …..OnClientClick="return callWSCheckConfirm();" OnClick="btnCallWS_OnClick" />
31
• 做一個 Web Service 、 Page Method or Web API …• ClientClick Call WS ,並加一個 flag 判斷,何時要 Call WS ,何時要
postback• Button 的 OnClick 寫實際要執行的事
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ?非同步 Call WS
<asp:Button ID="btnCallAsyncWS" ... OnClientClick="return callWSAsyncCheckConfirm();" OnClick="btnCallWS_OnClick" />
32
按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ?• Postback 2 次、 Callback 都是在同一個頁面處理• 其他方式需要將資料傳遞過去處理• 請依實際需求狀況選擇適合的方式
33
透過 HttpHandler 來防護文件檔• 如檢查 Session[“uid”] 不為空才能 download• public class CsvHandler : IHttpHandler, IReadOnlySessionState• public void ProcessRequest(HttpContext context)
• …..
<system.webServer><handlers> <add name="MyCsvHandler" verb="GET" path="*.csv"
type="MyProduct.CsvHandler" /></handlers>
</system.webServer>
34
Ooops!• Q. 為何 Button 都是淡藍色呢 ?
35
上線篇• 設定 ASP.NET 檔案上傳的大小• 客製化• 設定 Release 模式• 維護
36
如何設定 ASP.NET 檔案上傳的大小 ?
<system.web><!– 單位是 KB, 預設是 4096, 80 !><httpRuntime
maxRequestLength=“10240” requestLengthDiskThreshold=“256“ />
</system.web>
37
有放客製化的地方嗎 ?
38
有放客製化的地方嗎 ? (cont..)• 在 Application_BeginRequest Event 中處理• 寫在 Global.asax 之中• 寫個 HttpModule
<configuration><system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" type="MyModule.MyMu, MyMu"
preCondition="managedHandler" /></modules>
</system.webServer></configuration>
39
需要每個 Web.config 設定 debug = false 嗎 ?• <compilation debug=“true” />• Compilation 比較久• Memory 會用的比較多• WebResource.axd 不會被 cached
• 在 Machine.config 中設定以下的值,可強迫每個 Web AP 使用Release 模式 !
<system.web> <deployment retail="true" /></system.web>
40
如何設定系統停機維修狀態• 在網站下加入 app_offline.htm
41
IIS 篇• 查看目前的要求• 設定 IIS Log 的欄位• 讀取 IIS Log 的資訊• Log Parser• Log Parser Lizard
• 失敗要求的追蹤
42
查看目前的要求
43
設定 IIS Log 的欄位
44
讀取 IIS Log 的資訊• Log Parser• logparser "SELECT top 10 cs-uri-stem, time-taken , sc-status, LogFilename FROM E:\
GSS\TechInfo\Demo\iislog\*.log ORDER BY time-taken DESC" -i:W3C
• Log Parser Lizard• 選取 IIS LogSELECT top 10 cs-uri-stem, time-taken , sc-status, LogFilenameFROM E:\GSS\TechInfo\Demo\iislog\*.logORDER BY time-taken DESC
• 匯到 DB 之中分析• logparser "select * into LogTable from 'E:\GSS\TechInfo\Demo\iislog\ex130222.log' "
-o:SQL -createTable:ON -server:. -database:tempdb -username:sa -password:yourpwd
45
讀取 IIS Log 的資訊Log Parser
46
讀取 IIS Log 的資訊Log Parser Lizard
47
匯到 DB 之中分析SELECT TOP 10 csUriStem, timeTaken / 1000.0 AS [timeTaken( 秒 )]FROM dbo.LogTableORDER BY timeTaken DESC
48
失敗要求的追蹤
49
ASP.NET 相關資源• ASP.NET Tutorial• Building Web Apps with ASP.NET Jump Start - 8 Hours of FREE Training
Videos• Introduction to ASP.NET