1.HTML表單的提交方式
對于一個普通HTML表單來說,它有兩個重要的屬性:action 和 method。
action屬性指明當前表單提交之后由哪個程序來處理,這個處理程序可以是任何動態網頁或者 servlet 或者 CGI(Common Gateway Interface),在asp.net里面一般都是都aspx頁面來處理。
method屬性指明form表單的提交方式。它有兩個可能值get和post。
(1)get方式提交的表單在地址欄會顯示參數名和參數值,而post方式不會。用post提交參數相對來說更隱蔽一些,也相對安全一些。假如我們這個頁面用于用戶登錄并且存放用戶信息的表為“users”,我們的sql語句可能會這么寫:
string sql=” select * from users where username='”+username+”’ and passWord='”+password+”’”;
然后我們的 username 和 password 變量從表單提交的數據獲取,正常情況下用戶填寫是沒有問題,就上面的例子來說用戶填寫的用戶名和密碼分別是“sa”和“123456”,那么我們最后得到的SQL語句是:
sql=”select * from users where username=’sa’ and password=’123456’”
這樣是沒有問題的。
如果用get方式提交,用戶可以對上面的參數進行一些改動,比如在地址欄直接輸入:
http://localhost/GetUserInfo.aspx?username=zhoufoxcn&pwd=123';delete * from users'
那么我們得到的SQL就是:
string sql=” select * from users where username='zhoufoxcn' and password='123';delete * from users'”
執行上面的SQL語句就能把Users這個表里的所有數據刪除掉!這個一個觸目驚心的危險!這個就叫SQL注入。
(2)由于瀏覽器地址欄能輸入的最大字符數有限制,所以用get方式提交不能處理參數值更大的表單,而post方式則沒有這個限制。
2.獲取表單值
通過用get方式提交表單我們可以看到提交到服務器的時候,在網頁后面有“?username=sa&pwd=12345”這么一個字符串,也就是以表單里HTML控件的名字=控件值的方式,并且如果存在多個控件,彼此之間以“&”分割,那么我們就可以以控件名來獲取控件值。獲取HTML控件值常見有以下集中方式:
獲取方式 | 表單提交方式 |
Request.QueryString["控件名"] | 適合于get方式提交的表單 |
Request.Form["控件名"] | 適合于post方式提交的表單 |
Request["控件名"] | 同時適合于get和post方式提交的表單 |
3.亂碼問題
對于用戶登錄的表單,我們在用戶名和密碼處分別輸入“小姑涼”和“123456”,用戶就可能會變成“???”,之所以出現這樣的情況就是因為我們的編碼原因。
所謂亂碼,就是用一種編碼的字符串卻用了另一種編碼來顯示,造成不能正常顯示的現象。
這就像我們在酒吧里對一個懂普通話的服務員說來一杯酒,他馬上會送你一杯酒;可是當我們對一個不懂普通話的服務員用普通話說來一杯酒,他就會一頭霧水了。
之所以出現亂碼就是因為在這里客服端請求的編碼和服務器響應的編碼不一致
默認情況下 Request 的 ContentEncoding 為 UTF8Encoding ,而 Response 的 ContentEncoding 為 System.Text.DBCSCodePageEncoding ,二者的不一致導致了輸入中文成了亂碼。
我們常見的編碼有 gb2312、gbk 和 unicode 幾種,gb2312 能顯示日常生活最常用的 6000 多個漢字,這對于一般的公文足夠了,可是如果要用來顯示一個古文獻就不行了(據說康熙詞典收錄了4萬多漢字),當它不能顯示的時候也會出現亂碼。
Gbk 是在 gb2312 的基礎上擴展的,大概能顯示1萬8千多個漢字,這對于一般古文獻也差不多夠了。
Unicode 則更大一些,它能顯示 20901 個漢字(范圍是從/u4e00到/u9fa5),并且還能顯示日文、韓文、臺灣文字、香港文字和新加坡等文字,所以目前很多網站都采用unicode編碼。Utf8編碼就是unicode編碼中的一種。
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
更改為:
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>
這樣就能正常顯示了。
建網站的時候默認編碼就是utf-8,無需更改。
4.服務器端表單
在此之前我們見到的表單都是如下格式:
<form action="接收數據頁面" method="post">
并且我們都是利用的HTML控件?,F在我們要介紹服務器端表單,服務器端表單與前面的表單相比,多了一個runat=”server”標記,如下:
<form id="form1" runat="server">
在服務器端表單里可以不用指定action屬性,表示由當前頁面處理,也可以不指定 method 屬性,默認為post方式提交表單。在服務器端表單里,我們不光可以使用 HTML 控件,還可以使用 HTML 服務器控件,還可以使用 asp.net 控件 。
另外需要注意的是,在一個 asp.net 頁面中可以有多個不帶 runat=”server” 標記的表單,但是只能有一個服務器端表單。
5.HTML服務器控件
HTML服務器控件與普通服務器控件不同的是:在普通HTML控件中加上了一個 id 屬性和一個 runat=”server” 標記。如下就是一個 HTML 服務器控件:
<input type="text" runat="server" id="txtUserName" />
HTML服務器控件有幾個限制:
在整個 asp.net 頁面中這個控件 id 的必須唯一,并且 HTML 服務器控件只能放在 HTML 服務器表單中。因為一個 asp.net 頁面只能有一個服務器表單,所以說在服務器表單中控件的 id 值必須唯一,因為我們在編程的時候通過這個 id 來訪問 HTML 服務器控件。如果不唯一就會報錯。
所有的服務器控件經過服務器運行之后都會變成標準的 HTML 控件。
這樣我們可以得出一個結論:如果我們的控件功能本來就很簡單,我們就可以直接使用HTML控件,這樣就可以減輕服務器的負擔,提高運行效率。
另外,在上面的代碼中多了一些以前我們沒有見過的部分:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNTQ0MjI5MTUzZGR1mFZ52ODFgAKe7Qx9/67qMGFJCA==" /><input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKipeT6DgKl1bKzCQK1qbSRCwLdkpmPAcJ7Zy/C66y />
因為服務器會保存服務器控件的狀態和屬性,所以它會利用一些隱藏域來保存這方面的信息,這部分的內容是經過 Base64 編碼的。
服務器控件的好處是我們可以動態在代碼中動態控制服務器控件的屬性。
來源:http://zhoufoxcn.blog.51cto.com/792419/166808
新聞熱點
疑難解答