2014年6月25日 星期三

我的網頁在 IE 11 下不能執行!?

今天發生的問題。

問題

我的網頁,在 IE11 下執行會發生錯誤,但 Chrome 卻是正常。所以 IE 好…

錯訊訊息

幸好,我們有留 exception log,並且當錯誤時直接會寄信到我們的信箱。

System.Data.SqlClient.SqlException: The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.

怎麼會和 SQL 有關係呢?

再看程式碼

public Order GetFeedbackData(string taxNo, DateTime today)
{
    const string sql = @"Select * from Orders where orderDate = {0}";
    var query = _db.Database.SqlQuery<Order>(
        sql, today.ToShortDateString()).FirstOrDefault();
    return query;
}

原來,和 SQL 組字串有關。再看 ToShortDateString 的 msdn 說明,這個方法與Thread.CurrentCulture 有關。

答案呼之欲出了。

Web.Config

再看 Web.config, 有一段設定如下

<globalization culture="auto" uiCulture="auto"/>

查一下 http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(v=vs.85).aspx,發現這個就是用來取得 Rquest 的 Thread.CurrentCulture 的根據。

使用 Fiddler 錄一下 Request, 發現 IE 11 的 Header Accept-Language: zh-Hant-TW,而 Chrome 的則為 zh-TW

答案揭曉。是 IE 10 之後,預設的 Accept-Language 改為 zh-Hant-TW

解決

解決方法很簡單,就是

  1. 不要組SQL 字串啦!
public Order GetFeedbackData(string taxNo, DateTime today)
{
    const string sql = @"Select * from Orders where orderDate = {0}";
    var query = _db.Database.SqlQuery<Order>(
        sql, today.ToShortDateString()).FirstOrDefault();
    return query;
}

直接使用 today 的 DateTime 型別傳入 Entity Framework 讓它為我們查詢即可。

參考

ASP.NET 2.0 多國語系網站與 Windows 8 的 IE10 語系設定

Visual Studio 2013 套件

整理一下我所使用的 Visual Studio 套件。

  1. SideWaffle : 增加好用的 snippet, project templates, item templates. 尤其在 angularjs 的開發上。
  2. OzCode : Debug 用
  3. jQuery Code Snippets
  4. Productivity Power Tools
  5. ReAttach : 重複 Attact 上一次所 attach 的 process。Debug 用
  6. SlowCheetah: xml Transforms, 轉換 .config 用,並且可以 preview 並比對轉換前後的差異
  7. Snippet Designer: http://snippetdesigner.codeplex.com/
  8. SpecFlow : BDD
  9. t4 editor: 寫 t4 template 用的編輯器
  10. Team Foundation Server Power Tool
  11. Web Essentials: 開發 Web 專案必備
  12. NUnit Test Adapter : 單元測試用
  13. xUnit Test Adapter : 單元測試用

Share with Facebook