2012-01-27 123 views
1

這是我的代碼:爲什麼我用相同的HtmlDecode()函數得到不同的結果?

string myText = "Wählen Sie bitte"; 
string myTextDecoded = HttpUtility.HtmlDecode(myText); 
Response.Write(myTextDecoded); 
ddAdulti.Items.Add(new ListItem(myTextDecoded, "")); 

在第一種情況下(的Response.Write)它打印,在我的html文件:

Wählen Sie bitte 

這是正確的!但在選擇框中的選項,打印,在我的html文件:

Wählen Sie bitte 

這是錯誤的(我已經對其進行解碼......具有相同功能)。

爲什麼會這樣?

+0

on HTML!呃... HtmlDecode的功能應該是一樣的:O爲什麼兩個不同的解碼?這是我的問題!刪除它不是解決方案(也因爲它做了另一種編碼,結果將是選擇下拉選項中的字符) – markzzz 2012-01-27 15:34:49

+0

我相當肯定你只是做出了一個不正確的假設這裏。嘗試將HtmlDecode的結果分配給一個變量並將其傳遞給Response.Write和ListItem ctor,並且您可能會看到相同的結果,在這種情況下,罪魁禍首就在其他地方。 – Rytmis 2012-01-27 15:39:13

+0

作爲一種證明我的觀點的方法,我創建了一個示例應用程序,並將您的代碼粘貼到頁面的Page_Init函數中:http://postimage.org/image/l7598yb4h/正如您所看到的,結果對於兩個下拉列表和Response.Write。 – Rytmis 2012-01-27 15:42:39

回答

4

根據您更新的問題,我將對您的理解做出潛在錯誤的假設。

我猜你正在查看HTML源代碼,並不理解爲什麼字符串編碼在一個地方,而在另一個地方未編碼。解釋很簡單:服務器端控件自動編碼其內容,而Response.Write寫入原始輸出。這是有原因的:服務器端控件通常包含用戶輸入,這固有地是不安全,所以它被自動編碼以防止cross-site scripting attacks,或者在不太危險的情況下,用戶輸入僅僅是打破你的頁面。

舉例來說,想象一下,如果列表沒有編碼的內容和你這樣做:

ddAdulti.Items.Add(new ListItem("</select>", "")); 
ddAdulti.Items.Add(new ListItem("An actual valid value", "")); 

最終的結果將是你的標記會是這個樣子:

<select> 
    <option></select></option> 
    <option>An actual valid value</option> 
</select> 

正如你所看到的那樣,這顯然已經壞了。最終結果取決於解釋瀏覽器,但很可能是一個空白的下拉列表。

現在,由於控制編碼的內容,標記結束是:

<select> 
    <option>&lt;/select&gt;</option> 
    <option>An actual valid value</option> 
</select> 

和工作的事情出很好。 :-)

[編輯]

它發生,我認爲從我的例子,它可能不是很清楚,爲什麼你看到與像「A」向人物的行爲。這是因爲許多字符編碼不支持混淆字母,因此對於控制編寫者來說,簡單地對7位ASCII字符集之外的所有字符進行編碼可能是最容易的。 :-)

[編輯2]

現在越來越清楚,我認爲原來的職位並沒有提供真正的問題。顯然,markzzz試圖做的是從數據庫中取未編碼的HTML,並按照原樣顯示給客戶端。已經存在一個WebForms控件來執行此操作:LiteralControl。它會顯示任何你堅持的內容,未經編碼。

也就是說,我不知道如何嵌入DropDownList的內部 - 請參閱我對解析HTML呈現方式的解釋。但是,如果您只想顯示項目列表,但不一定是下拉列表,則可以在Repeater或某些類似內部使用LiteralControl

+0

+1非常好的答案。 – Yuck 2012-01-27 16:09:09

+0

是的,很好的答案,但對我來說,它沒有任何意義的HTML實體的編碼。我的意思是:如果它看到'ä'是ä(所以它識別htmlentities)爲什麼把它放在一個7位ASCII字符? – markzzz 2012-01-30 08:02:28

+0

它鬆散的數據的一致性... imo ... – markzzz 2012-01-30 08:08:40

3

您可以在HTML中編寫兩種變體,並且兩者都可以正常工作(只要文檔已正確編碼)。這兩個示例都會生成相同的(有效)HTML和輸出:

W&#228;hlen 
Wählen 

未編碼的變音無效。它們相當於它們的編碼版本。

但是,如果你不編碼它們,你的頁面的編碼必須支持德文字符。 UTF-8的確如此。

爲什麼兩個變體導致不同的HTML? Response.Write不會對其輸出進行編碼,因此您可以輸出HTML,如"<b>x</b>"。 ListItems對它們的文本進行編碼,因爲無論如何您都無法輸出HTML。通過未編碼的文本是沒有意義的。

相關問題