2009年2月28日 星期六
ASP.NET 3.5 網站開發基礎-6
MasterPage
1.在Page中可用Master.FindControl找尋其主版頁面中的控制項。
2.在Page中加入前置詞MasterType VirtualPath="~/MasterPage.master",可用強型別方式存取Master中Public的屬性值。
網站導覽
使用SiteMap作為Menu&TreeView的資料來源。
WebConfig中可另行設定SiteMap的Provider,否則皆為預設的Web.sitemap檔。
我也被感染了,發燒中。
ASP.NET 3.5 網站開發基礎-5
除錯
錯誤類型、設定中斷點、除錯相關視窗,之前的課程已講過。
追蹤
Debug物件可將訊息輸出至Output Window。
System.Diagnostics.Debug.WriteLine(TextBox1.Text);
若要指定Listener為EvenLog等其餘地方,要在WebConfig設定。
若將專案的DebugConfiguration設定為release,建置出來的專案將無視Debug物件的存在。
ASP.NET2.0網站的DebugConfiguration沒有release,取而代之在WebConfig中設定DEBUG。
Trace分為三種:
1.網頁Trace
在Page前置詞設定Trace="True",頁面執行後可以在瀏覽器上看到追蹤報表。
2.網站Trace
在WebConfig設定Trace="Enabled",網頁執行後可以在根目錄下的Trace.axd看到追蹤報表。
請注意Trace的各項屬性設定。
3.自訂Trace
訂閱TraceFinished事件,可取得TraceRecords集合的成員,以及成員的各種屬性值。
追蹤報表中顯示的環境變數,也可以從程式中直接取得
如:Request.ServerVariables["REMOTE_ADDR"];
ASP.NET 3.5 網站開發基礎-4
ASP.NET基於安全性考量,頁面本身就有防止用戶端惡意輸入Javascript執行的檢查機制,
若不要使用,可在Page前置詞中設定ValidateRequest="false"
基本的四種驗證
RequiredFieldValidator、RangeValidator、RegularExpressionValidator、CompareValidator只能選擇在client或server二選一進行驗證。選擇方式為設定EnableClientScript屬性,預設為True。
RequiredFieldValidator可設定InitialValue去驗證控制項不可以為初始值。例如DropDownList預設value為"未選擇",可用此方法驗證使用者選取了沒。
RegularExpressionValidator預設的運算式不夠使用,可以參考通用運算式類別庫:http://regexplib.com/
CustomValidator
可以同時在Client & Server端進行驗證,server端驗證事件為ServerValidate。
若使用ValidationSummary的ShowMessageBox,則驗證控制項需選擇Client端驗證,訊息視窗方有效。
ASP.NET 3.5 網站開發基礎-3
html控制項、html server控制項、伺服器控制項
後兩者runat=server的控制項都會紀錄viewstate
動態註冊用戶端指令碼
ClientScript.RegisterClientScriptBlock:指令碼會被註冊在form標籤內的前端。
ClientScript.RegisterStartupScript:指令碼會被註冊在form標籤內的尾端。
ClientScript.RegisterClientScriptInclude:載入js檔。
因javascript為直譯式語言,在執行期才會編譯執行,因此有時後變數放在上面或下面會有差別。
其餘內容很簡單,自己翻書
ASP.NET 3.5 網站開發基礎-2
網頁模型(PageModel)
ASP.NET在2.0版本以後,提供了兩種預設的網頁設計模型:InLine & CodeBehind
我們公司開發模式習慣用CodeBehind將aspx與程式碼分離,並將InLine視為較舊的方式,
但事實上InLine提供了較直覺、且單檔易於維護的優點,很多程式設計師仍偏向使用它。
但對我而言,早已習慣程式碼分離模型,並將它視為理所當然。
網頁間的互相導向
1.超連結,不用多說,直接Request NavigateURL,走HPPT GET。
2.瀏覽器重新導向,Response.Redirect,當伺服器執行到此指令碼時,會Response回瀏覽器,由瀏覽器重新送出目的URL的Request,因此會做一次往返,而且網頁的URL會是目標網址。
3.伺服器重新導向,Server.Transfer,與瀏覽器重新導向相似,不同點在於不需做一次往返,由伺服器直接重導,網頁的URL會是原本的網址,而目的網頁限制於相同的Web應用程式中。
4.跨網頁POST,設定控制項的PostBackUrl屬性,與超連結不同的是,它會以HPPT POST的方式導向至目的網頁。
不同網站的網頁間傳遞值
QueryString,適用任何導向方式,直接依網址取得key、value值。
Form,當來源網頁使用跨網頁POST或是伺服器重新導向時,可利用來取得POST的內容
PreviousPage
網頁前置詞 "PreviousPageType VirtualPath='~/Default3.aspx'"
可由Page.PreviousPage取得來源網頁的public屬性。
Server.Transfer或PostBackUrl才會有PreviousPage。
if (Server.Transfer)
PreviousPage.IsCrossPagePostBack==True;
else if(PostBackUrl)
PreviousPage.IsCrossPagePostBack==False;
else
PreviousPage==null;
2009年2月27日 星期五
ASP.NET 3.5 網站開發基礎-1
本章只是在重複介紹.NET FRAMEWORK版本以及開發工具的基本常識。
需要注意的一些重點如下:
1.用戶端browser送出請求時,WebServer監聽80port,發現目標網頁為aspx檔案便呼叫w3wp.exe代理程式,載入aspnet_ISAP.dll引擎,執行網頁程式。
2.建立ASPNET網站有兩種方式:(1)專案類型方式,此種方式用於較舊版的開發方式,所有網頁程式事先於設計階段編譯成dll,並放置在於ServerExplorer中隱藏的bin資料夾。(2)網站類型方式,這是主流,每個網頁都會在runtime動態編譯為一個dll,並放置在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\的暫存目錄中執行。
3.網站類型又分為四種開啟方式:(1)FileSystem,不需要WebServer(IIS),它使用VS所建立的虛擬開發Server,需注意不要將路徑設定在桌面或是MyDocuments以避免之後會有權限的困擾。資料夾權限部份會等於登入者的權限。(2)LocalIIS(即HTTP),網站建立在IIS的虛擬目錄中,OS版本若為WindowsServer2000,IIS版本為5.0,WindowsServer2003、XP,IIS版本為6.0,WindowsServer2008、VISTA,IIS版本為7.0,至於資料夾權限需要特別注意,IIS5.0設定權限的帳號是ASPNET、IIS6.0以後則為NetworkService而非登入者帳號。(3)FTP,用於維護。(4)RemoteSite,也用於維護,而且需要安裝FrontPageServerExtensions方能使用,然而更大問題是會跟SharePoint Server相衝,因此更為少用。
2009年2月24日 星期二
第二個禮拜
流程控制
if判斷式,應該不用多做解釋
而swith使用上一要注意兩個地方:
1. 運算式的結果必須為整數、列舉或字串
2. 如果沒有使用break離開,會一直做下去
switch(aa)
{
case a : MessageBox.Show("Hello");
case b : MessageBox.Show("Hi");
case c : MessageBox.Show("你好");
}
如果結果是b,會印"Hi"、"你好"
因為沒有使用break,會從找到的結果以下一直做,做到看到break為止
迴圈:for、foreach、while、do
比較要注意的是break和continue的使用
for( int i = 0; i<100; i++)
{
j += i;
if (i == 50)
break;
if(i == 25)
continue;
j +=1;
}
上述程式碼會從1加到50而不是100,因為在50就break了
而每次加都會多加一,只有在25的時候不會,因為遇到continue關鍵字會從下一個迴圈繼續做
忽略continue以下全部的程式碼
例外狀況處理
catch的時候,可以多重catch
不過要子代先catch再catch父代,不然會造成compile time error
而finally則是一定會做的事情
就算在try catch遇到return關鍵字也會做
補充
int? a = null;
int b;
b = a?? 6;
Nullable
int b;
b = a.HasValue ? a.Value : 6 ;
上面兩段是完全一樣的程式
第六章:陣列、泛形與集合
補充:
1.
Hashtable的item是DictionaryEntry
而Dictionary<>的item則是KeyValuePair<>
2.
陣列不能唯獨、速度快;集合則剛好相反
第七章:物件導向與法
下列的資料會自動初始化:
static變數、實體變數、陣列中的元素
partial method
1. 只能存在於partial class中
2. 不可有回傳值(void)
3. 隱含為private,不可改變,也不需註明
4. 不能建立委派(delegate)到部份方法
5.若沒有實作,則會忽略呼叫
建構子
overload時,若需呼叫自己或副類別建構子
使用this和base關鍵字
public A(int a) { this.age = a; }
public A() : this(15) {}
public A() : base(16) {}
上述程式碼就可以在建構子間作呼叫
補充
using QQ = System.Web.UI.MobileControls;
...(略)
QQ.List a = new QQ.list;
第八章:物件導向進階
class內屬性的唯讀,可參考下列程式碼
public EmpName { get; private set; }
不同於interface的private set
interface若宣告某個屬性只有get,實作的class則可決定要不要有set;
但interface內若宣告private set;實作的class則一定只能get
覆寫和隱藏
父類別使用virtual關鍵字的method,表示可以給子類別用override關鍵字作覆寫
若子類別沒有使用override關鍵字,則可用new來隱藏父類別方法,無論覆類別有沒有virtual
狀況一
父親:public virtual void AA() { MessageBox.Show("Hello"); }
兒子:public override void AA() { MessageBox.Show("Hi"); }
狀況二
父親:public void AA() { MessageBox.Show("Hello"); }
兒子:public new void AA() { MessageBox.Show("Hi"); } (new可忽略,但若四級警告會錯誤)
父親 a = new 兒子();
a.AA()
狀況一會顯示Hi,而狀況二會顯示Hello
2009年2月15日 星期日
第二天上課(台北恆逸)
第六章:陣列、集合與泛型
因為第四章要運用到陣列,所以先提一下第六章順便補充說明一下第三章提供的實值型別與參考型別的差異,放在最後的補充說明
陣列總覽
寫程式時經常用到的陣列,卻不知道原來陣列也有名字
int a[] - 一般陣列
int a[,] - 多維陣列
int a[][] - 不規陣列(又稱陣列中的陣列)
一般陣列就不多說了,多維陣列和不規則陣列的差異在初始及應用不同。
多維陣列初始就知道大小
int[,] a=new int[2,3];
而不規則陣列則是先宣告一維陣列的大小
int[][] a=new int[2][];
再決定子陣列大小
a[2]=new int[5];
第四章:方法和運算子
宣告方法的參數列
- 輸入參數 PassByVal
- 參考參數 PassByRef
- 輸出參數 PassByOut
- 參數陣列 PassByParam
第一種輸入參數就不多提了,來討論一下何時使用參考參數、何時使用輸出參數。
由於不像輸入參數會建立新的記憶體位置,參考參數是直接存取原參數記憶體位置,因此使用前必須事先宣告,不然你的VS就會跟你不高興,這點和輸出參數不同,輸出參數不用事先宣告,相對的你必須在輸出參數內宣告一個新的記憶體位置。
這裡我是提供自己的想法,如果有不對地方請多多指教
其實在.NET BCL中,很少看的到這二種運用,我一時想不到有參考參數的例子,倒是記得在很多的xxx.TryParse()中有out的運用,我的解釋是這樣的,如果你的方法已經有一個回傳值,但是又非得回傳更多的回轉值時,你就可以使用這二種參數,至於使用時機如DateTime.TryParse(string s,out DateTime result)就是一個典點的事先不會預設值,而是透過方法內建立一個新的記憶體位置後回傳,所以你可以這樣
DateTime result;
string s=“2009/02/14”;
DateTime.TryParse(s,out result);
另外何時用參考參數,例如方法很多,但都是使用同一個變數的時候,尤其各方法又各自有自己的回傳值時
void check(ref People user)
{
if(check2(user))
check3(user);
else
check4(user);
}
資料轉換
一般有型別自己提供的Parse、TryParse,另外還有一種針對之前有提到的CTS提供的轉換類別Convert,使用方法像是
Convert.ToInt32(“5”);
Convert.ToBoolean(“True”);
補充說明
實值型別與參考型別的差異
int a=5;
int b=a;
這時候a=5,b=5。因為int是實值型別,因此b複製了a的值:
b=10;
這時候a=5,b=10。a還是5,而b更新了自己的值為10。
int[] aa={0,1,2};
int[] bb=aa;
bb[2]=3;
aa[2]的值是??
這時候aa[2]的值是3,因為bb=aa是複制了記憶體位置,因為陣列是參考型別。
說明文件
這邊提醒一下剛使用VS的工程師,微軟提供了非常豐富的說明文件,大部份都有多國語言,但是除了上http://msdn.microsoft.com自己尋找之外,如何透過VS來快速查詢,答案是你只要在你有疑問的程式段落上,以滑鼠點一下位置或圈選起來,接著按F1之後,VS就會幫你連結到最有可能的解答連結(當然如果你是使用本機的MSDN Library會比較快,不過網路上是資訊肯定是最新的)
2009年2月14日 星期六
第一天上課(台北恆逸)
第一章:認識.NET Framework
介紹.NET Framework版本、教你有關BCL(Base Class Library)、CLR(Common Language Runtime)的基本知識、執行環境、版本功能的差異,其實BCL就是指.NET Framework已經幫我們準備好的程式,例如Windows Form`訊息對話框,只要直接使用MessageBox類別、連結資料庫存取使用System.Data下面的類別。
第二章:Visual Studio 2008開發工具
這部分是台灣書籍講的特別清楚的環節,比較特別的是講到工具列的運用時,以前除了知道加入自訂或其他元件的功能,原來還能拉一段文字拖拽在上面,當成暫存的剪貼簿重覆使用。
第三章:變數與資料型別
宣告變數語法
我們都知道每個語言有保留的關鍵字作為特殊用除,那我們可以用C#關鍵字來宣告變數名稱嗎?答案是可以,使用方法是前面必須要加上「@」,例如至於要用在什麼地方?還沒能想到也,不過「@」和「_」有什麼差別呢!他們的差別如下:
string @string;
string _string;
這時候你的自動完成功能裡面會有個變數是string和一個_string,另外我們知道變數不能以數值開頭作為宣告,還有一個差別就在這裡,如下:
string @1abc;
string _1abc;
唯讀變數與常數
唯讀跟常數,對剛入門的設計師可能較不會注意到的地方
- 唯讀變數的值可以在執行時期再決定《可以經由方法於執行期間指定,如int a=GetNumber()》
- 常數的值必須在編譯時期就要決定《必須宣告就要指定值,如int a=5》
C#基本型別觀念
實值型別跟參考型別也是經常被混淆的地方,
C#內建型別與共通型別(Common Type System,CTS)
舉個例子:
C#的int 就是CTS的System.Int32,同時也是VB的Integer,所以各種語言的型別都有各自對應CTS的型別,他們是通用的。
列舉型別資料
Enum abc
{
a=0,
b=1,
c=2,
}
string[] names=Enum.GetNames(typeof(abc));
Array values=Enum.GetValues(typeof(abc));
第一個沒問題,我們可以取得a,b,c,那麼第二個取得的是?,這裡舉二個例子
foreach(var item in values) {} 得到的是a,b,c
foreach(int item in values) {} 得到的是0,1,2
要注的意地方是,這裡的Values值不是指a,b,c的值,而是Enum abc的值,所以取得未轉型時得到的是a,b,c,而以int轉型時得到的才是0,1,2。
老師補充的存取範圍卻沒講的地方
這是一般常見的宣告方式public、private、protected、internal ,其實還有一種經常被疏忽掉的protected internal。
MSDN的說明如下
protected internal 存取範圍表示 protected OR (或) internal,而非 protected AND (和) internal。換句話說,protected internal 成員可從在相同組件中的任何類別進行存取,其中也包括衍生類別。若要將存取範圍限制為僅在相同組件中的衍生類別,請將類別本身宣告為 internal,並且將其成員宣告為 protected。