文章目錄
1.Web應用程式和網站2.最簡單的ASP.Net程式處理過程3.ASP.Net的IsPostBack揭秘
WebApplication(Web應用程式)和WebSite(網站)的區別,WebSite是為了相容從ASP轉過來的開發人員的習慣而存在的,用起來簡單,比如不需要建立命名空間、CS代碼修改以後不需要重啟就能看到變化(無論是WebSite還是WebApplication,修改aspx都不需要重啟。 WebApplication每次修改以後點擊【產生解決方案】也能立即看到修改效果),但是不利於工程化開發,比如代碼出錯不容易發現,代碼不分命名空間。開發技術上沒有任何區別,只是開發、調試習慣不同而已。方便開發不用每次調試都設定起始頁,在項目的選項中設定【Web】→啟動操作→當前頁面,這樣當前啟用的頁就是起始頁。講簡單基礎知識時用WebSite;講進階技術和做項目的時候用WebApplication。
建立WebApplication
建立WebSite
提交到伺服器的表單元素一定要加上"name"元素
每當使用者請求訪問ashx頁面的時候,ProcessRequest方法就會被調用,通過訪問context.Request獲得訪問者的請求參數等。例子中就取到了UserName參數.
然後在ProcessRequest中通過context.Response向瀏覽器發回資料給瀏覽器。ProcessRequest結束之時就是伺服器為這個瀏覽者本次訪問服務完成之時,瀏覽器向伺服器端提交資料,被提交資料的表單(input、select、textarea等)放到form中,form中通過action屬性設定表單被提交給哪個頁面,為了在服務端取出表單項的值,需要在HTML中為表單元素設定name屬性,注意id是給Javascript操作Dom用的,name才是提交給伺服器用的。在伺服器端用context.Request["username"]來根據表單項的name來獲得提交的屬性值。通過context.Response.Write向瀏覽器輸出處理後的顯示HTML內容。
建立一個ashx檔案, ProcessRequest中寫
context.Response.ContentType = "text/html";//html表示瀏覽器識別成html語言string username = context.Request["UserName"];//取得使用者提交過來的name為UserName的表單的值context.Response.Write(username + 你好);
建立一個html頁面,建立一個form,設定action指向剛才寫的ashx檔案,那麼點擊submit的時候,就會把表單裡面的參數都傳遞個Hello1.ashx檔案了
<form action="Hello1.ashx">姓名<input type="text" name="UserName"/><input type="submit" value="提交"/></form>
但是這樣做的話,啟動瀏覽器從html跳轉到ashx頁面,之前的使用者名稱和輸入框就沒有了,解決這個問題沒有太好的辦法,只好把先前的樣子在ashx檔案中再畫出來,見程式
public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/html"; string userName = context.Request["UserName"]; context.Response.Write(@" <form action='Hello1.ashx'>姓名:<input name='UserName' type='text' /><input value='提交' type='submit' /></form> ");//這一行操作是把先前的html原有的東西畫出來,把之前的html代碼,寫到context.Response.Write就可以了(@的意思是多行文本不被分開識別) //context.Response.Write("Hello World"); context.Response.Write(userName); }
也可以使用context.Server.MapPath內建讀取
context.Response.ContentType = "text/html"; string userName = context.Request["UserName"]; string path = context.Server.MapPath("Hello2.html");//擷取Hello2.htm的全路徑,所以用了MapPath方法 string content = System.IO.File.ReadAllText(path);//讀取檔案 context.Response.Write(content); //context.Response.Write(path); context.Response.Write(userName);
這樣就不用拷貝htm的全部代碼了,而且不用先開啟htm,再跳轉到ashx.現在直接開啟ashx檔案就能顯示出htm頁面裡面的全部內容了.
剛進入hello2.ashx的時候是直接向瀏覽器輸出內容,使用者在輸出的內容中填入數值,再點擊提交,伺服器就知道“提交回來了”(PostBack)
為了區分是第一次直接進入頁面還是點擊提交以後重新進入ashx,在form中增加一個隱藏欄位:<input type="hidden" name="ispostback" value="true" />,如果能夠從Request中讀取到ispostback=true就說明是點擊提交以後重新進入ashx,否則就是第一次進入ashx。ispostback就是一個標誌位。
<input type="hidden" name="ispostback" value="true"/>
string ispostback = context.Request["ispostback"]; if (ispostback == "true") { context.Response.Write("提交後進入"); } else { context.Response.Write("直接進入"); }
Http是請求、響應的模型,伺服器不會來讀取瀏覽器的網頁,能夠得到的就是用戶端網頁提交過來的資料。邏輯處理樣本:
先寫預留位置@vlaue,@msg,然後再ashx(@value也可以寫$value,自己定義,前後一致就行)
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; string userName = context.Request["UserName"]; string msg = "";//聲明msg變數 string ispostback = context.Request["ispostback"]; if (ispostback == "true") { context.Response.Write("提交後進入"); msg = userName + "您好!"; } else { context.Response.Write("直接進入"); msg = userName + ""; } string path = context.Server.MapPath("Hello2.html");//擷取Hello2.htm的全路徑,所以用了MapPath方法 string content = System.IO.File.ReadAllText(path);//讀取檔案 content = content.Replace("@value", userName);//替換預留位置@value content = content.Replace("@msg", msg); context.Response.Write(content); }
提交前
提交後
所有表單都是提交的以name為key,以value為值的內容,其他屬性是不會被提交到伺服器的。