asp.net開發要注意的是?

50
ASP.NET 開開開開開開開 ASP.NET 開開開開開開開 ? 1 開開開 [email protected] w 25867890 # 515

Upload: rainmaker-ho

Post on 08-Jan-2017

8 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Asp.net開發要注意的是?

1

ASP.NET 開發的奇幻漂流ASP.NET 開發要注意的是 ?

亂馬客 [email protected] # 515

Page 2: Asp.net開發要注意的是?

2

Outline• ASP.NET 開發要注意的是 ?(ASP.NET 2.0 以上 )• 基本篇

• 設定 TextBox Focus 、 Default Button 、驗証• GridView 篇

• GridView 分頁、資料分頁、取得選取列的 Key 值…• 狀態篇

• ViewState• 特殊篇

• 動態加入控制項、先回 Server 檢查、 HttpHandler• 上線篇

• 客製化、設定 Release 模式、維護• IIS 篇

• 查看目前的要求、設定 IIS Log 的欄位、讀取 IIS Log 的資訊…

Page 3: Asp.net開發要注意的是?

3

基本篇• 設定 TextBox Focus• 設定預設 Button• 必填欄位驗證• 檢查行動裝置

Page 4: Asp.net開發要注意的是?

4

Page 上預設 Focus 的 TextBox 在那裡呢 ?• 可透過以下方式來設定 Focus

DefaultFocusTextBox.Focus();

Page.SetFocus(DefaultFocusTextBox);Page.SetFocus(DefaultFocusTextBox.ClientID);

form1.DefaultFocus = DefaultFocusTextBox.ClientID;

Page 5: Asp.net開發要注意的是?

5

如何設定預設的 Button?• 設定 form or panel 的 DefaultButton 屬性

form1.DefaultButton = Button1.UniqueID;

panel1.DefaultButton = Button1.UniqueID;

Page 6: Asp.net開發要注意的是?

6

顯示完必輸欄位後,為何沒有 Focus 呢 ?• 設定 RequiredFieldValidator 的 SetFocusOnError = “True”

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"ErrorMessage="TextBox3 一定要輸入哦 " ControlToValidate="TextBox3"SetFocusOnError=“True" />

Page 7: Asp.net開發要注意的是?

7

動態設定必填欄位需要 Postback 嗎 ?

AutoPostBack="True" OnCheckedChanged=“event“

vldWay_1.Enabled = chkWay_1.Checked;

Page 8: Asp.net開發要注意的是?

8

動態設定必填欄位需要 Postback 嗎 ?(cont..)• $(document).read, checkBox 變動時• 設定必填欄位啟用與否

ValidatorEnable(ValidatorControl, true/false);

ValidatorEnable(txtWay_2_Validator, chkWay_2.checked);

Page 9: Asp.net開發要注意的是?

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

Page 10: Asp.net開發要注意的是?

10

GridView 篇• GridView 分頁• 資料分頁• 取得選取列的 Key 值• ClientIdMode• …

Page 11: Asp.net開發要注意的是?

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();

Page 12: Asp.net開發要注意的是?

12

如果資料量很大,要如何處理呢 ?• GridView• AllowPaging="True“• DataSourceID="odsGridView"

• ObjectDataSource• EnablePaging="True“• OnSelecting="odsGridView_Selecting“• MaximumRowsParameterName="pageSize" • StartRowIndexParameterName="startIndex"• TypeName="MyProduct.BO.Person“• SelectMethod="GetPersonsPaging"• SelectCountMethod="GetSelectedCount"

Page 13: Asp.net開發要注意的是?

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)

Page 14: Asp.net開發要注意的是?

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();

Page 15: Asp.net開發要注意的是?

15

如何取得 GridView 選取列的資訊 ? (cont..)

• 透過 GridViewRow ,利用 FindControl 來取得Control lblKey = ((GridViewRow)((Button)e.CommandSource).NamingContainer).FindControlRecurive("labelName");if (!lblKey.IsNull()){

string dataKey2 = (lblKey as Label).Text;}

Page 16: Asp.net開發要注意的是?

16

Postback 後可以不要每次都要 Scroll 嗎 ?• MaintainScrollPositionOnPostback = “true”

<%@ Page MaintainScrollPositionOnPostback="true“ …

<pages maintainScrollPositionOnPostBack="true“ …

Page 17: Asp.net開發要注意的是?

17

ClientIDModeASP.NET 4.0值 說明Inherit 繼承父控制項的 ID 產生機制AutoID 與之前版本相同的用戶端 ID 產生方式Predictable 透過一個確定的機制來產生用戶端的 ID

通常與父控制項 ClientIDRowSuffix 配合Static 與伺服端指定的 ID 相同

Page 18: Asp.net開發要注意的是?

18

Page 19: Asp.net開發要注意的是?

19

可以暫時停止 Ajax?• 使用 Ajax (ScriptManager + UpdatePanel)• 有錯誤時如果不好查,可設定 ScriptManager

EnablePartialRendering=“False"

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering=“False" ...

Page 20: Asp.net開發要注意的是?

20

狀態篇• ViewState

Page 21: Asp.net開發要注意的是?

21

ViewState Size 太肥問題• 用內建的 SessionPageStatePersister 取代預設的

HiddenFieldPageStatePersister

• 用 3Party 元件• Flesk.ViewStateOptimizer ( 壓縮後再存 )

protected override PageStatePersister PageStatePersister{

get{

return new SessionPageStatePersister(this);}

}

Page 22: Asp.net開發要注意的是?

22

ViewState 放到了 Session Hidden 欄位為何還有資料呢 ?• 因為有些資料是放在 ControlState 之中

<system.web><browserCaps> <case>RequiresControlStateInSession=true</case></browserCaps>

</system.web>

Page 23: Asp.net開發要注意的是?

23

特殊篇• 動態加入控制項• 按 Button 時可以先回 Server 檢查後,再問 User 要不要做• HttpHandler

Page 24: Asp.net開發要注意的是?

24

動態加入控制項的時機

Page 25: Asp.net開發要注意的是?

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;

}

Page 26: Asp.net開發要注意的是?

26

按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ?

Page 27: Asp.net開發要注意的是?

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')};" }

Page 28: Asp.net開發要注意的是?

28

• Page_Load 時判斷是不是真的要處理

按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ? Postback 2 次if (Page.IsPostBack){

// 判斷是不是按下確認回來的if (Request.Form["__EVENTARGUMENT"] == "ProcbtnRun")

ProcessConfirm();}

Page 29: Asp.net開發要注意的是?

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(&#39;__Page&#39;,&#39;RunCallback&#39;,btnCallBack_CallbackHandler,&quot;&quot;,null,false); return false;" ..

Page 30: Asp.net開發要注意的是?

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" />

Page 31: Asp.net開發要注意的是?

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" />

Page 32: Asp.net開發要注意的是?

32

按 Button 時可以先回 Server 檢查後,再問 User 要不要做嗎 ?• Postback 2 次、 Callback 都是在同一個頁面處理• 其他方式需要將資料傳遞過去處理• 請依實際需求狀況選擇適合的方式

Page 33: Asp.net開發要注意的是?

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>

Page 34: Asp.net開發要注意的是?

34

Ooops!• Q. 為何 Button 都是淡藍色呢 ?

Page 35: Asp.net開發要注意的是?

35

上線篇• 設定 ASP.NET 檔案上傳的大小• 客製化• 設定 Release 模式• 維護

Page 36: Asp.net開發要注意的是?

36

如何設定 ASP.NET 檔案上傳的大小 ?

<system.web><!– 單位是 KB, 預設是 4096, 80 !><httpRuntime

maxRequestLength=“10240” requestLengthDiskThreshold=“256“ />

</system.web>

Page 37: Asp.net開發要注意的是?

37

有放客製化的地方嗎 ?

Page 38: Asp.net開發要注意的是?

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>

Page 39: Asp.net開發要注意的是?

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>

Page 40: Asp.net開發要注意的是?

40

如何設定系統停機維修狀態• 在網站下加入 app_offline.htm

Page 41: Asp.net開發要注意的是?

41

IIS 篇• 查看目前的要求• 設定 IIS Log 的欄位• 讀取 IIS Log 的資訊• Log Parser• Log Parser Lizard

• 失敗要求的追蹤

Page 42: Asp.net開發要注意的是?

42

查看目前的要求

Page 43: Asp.net開發要注意的是?

43

設定 IIS Log 的欄位

Page 44: Asp.net開發要注意的是?

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

Page 45: Asp.net開發要注意的是?

45

讀取 IIS Log 的資訊Log Parser

Page 46: Asp.net開發要注意的是?

46

讀取 IIS Log 的資訊Log Parser Lizard

Page 47: Asp.net開發要注意的是?

47

匯到 DB 之中分析SELECT TOP 10 csUriStem, timeTaken / 1000.0 AS [timeTaken( 秒 )]FROM dbo.LogTableORDER BY timeTaken DESC

Page 48: Asp.net開發要注意的是?

48

失敗要求的追蹤