公司開發的 Label 控制項,在Text屬性中使用 AntiXss 的 Encoder.HtmlEncode ,結果會發生「2014/4/24 下午 05:05:32 為不支援的日期格式」錯誤 !
是什麼問題呢?
前幾天同事Jue跟我分享,在ASPX上的公司的 Label 控制項,在Text屬性中使用 AntiXss 的 Encoder.HtmlEncode ,結果會發生錯誤!
Parameters : vstrText=2014/4/24 下午 05:05:32 為不支援的日期格式
aspx如下,
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField HeaderText="c2">
<itemtemplate>
<自行開發:Label ID="Label6" runat="server" Text='<%# Microsoft.Security.Application.Encoder.HtmlEncode(Eval("c2").ToString()) %>'>Label</自行開發:Label>
</itemtemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
aspx.cs中Bind GridView,如下,
DataTable dt = new DataTable("DT");
dt.Columns.Add("c1", typeof(int));
dt.Columns.Add("c2", typeof(DateTime));
dt.Columns.Add("c3", typeof(string));
dt.Rows.Add(1, DateTime.Parse("2013/04/25 13:20:30"), "c3-1");
dt.Rows.Add(2, DateTime.Parse("2013/04/26 08:20:30"), @"c3-2<script>");
GridView1.DataSource = dt;
GridView1.DataBind();
Encoder.HtmlEncode 在MSDN上的說明如下,
編碼指定的字串,作為 HTML 標記中的文字並選擇性地指定是否要使用 HTML 4.0 具名實體。
備註:
這個方法會將編碼不安全的清單中的所有字元。 使用編碼字元&#DECIMAL;標記法。
而發生錯誤的原因是因為我們有包裝 Label 控制項,可設定不同的資料類型來呈現,這次要呈現的是日期。
2013/4/25 下午 01:20:30 經由 Encoder.HtmlEncode 後,就變成了 2013/4/25 下午 01:20:30 ;
2013/4/26 上午 08:20:30 經由 Encoder.HtmlEncode 後,就變成了 2013/4/26 上午 08:20:30 。
那怎麼辦呢? 取得資料時,在SQL將日期的資料轉成字串嗎? 有不改程式的方式嗎?
那就要知道 日期 ToString() ,為什麼有的機器會出現上午/下午,而有的機器卻不會出現,而是24小時。
主要是 Thread.CurrentThread.CurrentCulture.Name 的值應該是 zh-TW,而 控制台=>地區 中 完整時間 的設定為 tt hh:mm:ss,如下圖,
所以可以調整 完整時間的呈現方式為 HH:mm:ss ,應該就不會有 上午/下午 的問題了!
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^