More Related Content Similar to Asp.net開發要注意的是?
Similar to Asp.net開發要注意的是? (20) 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的資訊… 2
5. 如何設定預設的Button?
• 設定form or panel的DefaultButton屬性
form1.DefaultButton = Button1.UniqueID;
panel1.DefaultButton = Button1.UniqueID;
5
11. 請做有分頁的GridView
• GridView
• AllowPaging="True“
• OnPageIndexChanging="GridView1_PageIndexChanging“
• GridView1.PageIndex = e.NewPageIndex;
<asp:GridView ID="GridView1" AllowPaging="True"
OnPageIndexChanging="GridView1_PageIndexChan
ging“ ….
GridView1.DataSource = mydataSource;
GridView1.DataBind(); 11
12. 如果資料量很大,要如何處理呢?
• GridView
• AllowPaging="True“
• DataSourceID="odsGridView"
• ObjectDataSource
• EnablePaging="True“
• OnSelecting="odsGridView_Selecting“
• MaximumRowsParameterName="pageSize"
• StartRowIndexParameterName="startIndex"
• TypeName="MyProduct.BO.Person“
• SelectMethod="GetPersonsPaging"
• SelectCountMethod="GetSelectedCount"
12
13. 如果資料量很大,要如何處理呢? (cont..)
• Nbase20 搭配SQL usp_paging(Store Procedure)來做資料分頁
EXEC(
'DECLARE @StartRow int, @EndRow int
SET @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)
13
14. 如何取得GridView選取列的資訊?
• 在GridView上的Button 在RowCommand Event中
• CommandArgument屬性
• 取得 RowIndex ,透過 RowIndex 來取得DataKeys
string key = e.CommandArgument.ToString();
14
int index =
((GridViewRow)((Button)e.CommandSource).NamingConta
iner).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;
}
15
19. 可以暫時停止Ajax?
• 使用 Ajax (ScriptManager + UpdatePanel)
• 有錯誤時如果不好查,可設定ScriptManager
EnablePartialRendering=“False"
<asp:ScriptManager ID="ScriptManager1"
runat="server" EnablePartialRendering=“False" ... 19
21. ViewState Size太肥問題
• 用內建的 SessionPageStatePersister 取代預設的
HiddenFieldPageStatePersister
• 用3Party元件
• Flesk.ViewStateOptimizer (壓縮後再存)
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}
21
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;
} 25
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')};"
}
27
29. • Page要實作 ICallbackEventHandler
• Button的OnClientClick = ClientScript.GetCallbackEventReference 等等
一堆JS去串起來
• 在ICallbackEventHandler.RaiseCallbackEvent 中處理Logic
• 在ICallbackEventHandler.GetCallbackResult() 回傳判斷結果
• Button的OnClick 寫實際要執行的事
• Client端還要覆寫原生的 WebForm_DoCallback Method (有Bug)
按Button時可以先回Server檢查後,
再問User要不要做嗎? Callback
29
<input type="submit"
onclick="WebForm_DoCallback('__Page','RunCallback
9;,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" />
30
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" />
31
33. 透過HttpHandler來防護文件檔
• 如檢查Session[“uid”]不為空才能download
• public class CsvHandler : IHttpHandler, IReadOnlySessionState
• public void ProcessRequest(HttpContext context)
• …..
33
<system.webServer>
<handlers>
<add name="MyCsvHandler" verb="GET" path="*.csv"
type="MyProduct.CsvHandler" />
</handlers>
</system.webServer>
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>
38
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> 39
44. 讀取IIS Log的資訊
• Log Parser
• logparser "SELECT top 10 cs-uri-stem, time-taken , sc-status, LogFilename
FROM E:GSSTechInfoDemoiislog*.log ORDER BY time-taken DESC" -i:W3C
• Log Parser Lizard
• 選取IIS Log
SELECT top 10 cs-uri-stem, time-taken , sc-status, LogFilename
FROM E:GSSTechInfoDemoiislog*.log
ORDER BY time-taken DESC
• 匯到DB之中分析
• logparser "select * into LogTable from
'E:GSSTechInfoDemoiislogex130222.log' " -o:SQL -createTable:ON -
server:. -database:tempdb -username:sa -password:yourpwd
44
Editor's Notes 要先focus在畫面上! 2RequiredValidationDemo RequiredValidationDemo.aspx http://www.codeproject.com/Articles/213825/ASP-net-Mobile-device-detection GridViewPagingInMemory GridViewPagingInDatabase.aspx USE AdventureWorks2012
go
declare @p3 int
set @p3=15470
exec usp_paging @recordCount=@p3 output
,@strSQL='SELECT BusinessEntityID, FirstName, MiddleName, LastName FROM Person.Person'
,@strORDER='ORDER BY FirstName ASC'
,@startIndex=5
,@pageSize=5
select @p3 as [Total Count]
GridViewPagingInMemory.aspx 4_1ClientIdModeDemo.aspx UpdatePanel.aspx => SelectedIndexChanged 5UpdatePanel.aspx Web.config
UpdatePanel.aspx 1.先直接Postback,所以DynamicAddTextBox2的backColor不見了
2.加入一個TextBox,再Postback,結果DynamicAddTextBox1的backColor不見了
3.使用Add取代AddAt
4.使用Addat,移到Page_Init之中
ServerCheckConfirm.aspx
ServerCheckConfirm.aspx
ServerCheckConfirm.aspx
ServerCheckConfirm.aspx
ServerCheckConfirm.aspx
全都上傳到memory,requestLengthDiskThreshold多大之後會存到disk 1.如果在Global.asax.cs中處理,需將 runAllManageModuleForAllRequests=“true”
2.如果在HttpModule處理,就不需要設定preCondition=“manageHandler”
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG
找<system.web>
在最上面加入 <deployment retail="true" /> http://technet.microsoft.com/zh-tw/library/cc754702(v=ws.10).aspx http://mlichtenberg.wordpress.com/2011/02/03/log-parser-rocks-more-than-50-examples/
logparser "SELECT top 10 cs-uri-stem, time-taken , sc-status, LogFilename FROM E:\GSS\TechInfo\Demo\iislog\ex130222.log ORDER BY time-taken DESC" -i:W3C
SELECT top 10 cs-uri-stem, time-taken , sc-status, LogFilename
FROM E:\GSS\TechInfo\Demo\iislog\ex130222.log
ORDER BY time-taken DESC
logparser "select * into LogTable from 'E:\GSS\TechInfo\Demo\iislog\ex130222.log' " -o:SQL -createTable:ON -server:. -database:tempdb -username:sa -password:0935