2010-11-03 72 views
3

我有一個混合的ASP.Net Web窗體/ MVC應用程序。在其中一個MVC「頁面」/視圖中,我使用ToShortDateString()和ToLongDateString()渲染了一堆日期。這些工作在大多數情況下都能正常工作,但是在編譯應用程序後第一次加載視圖時,它們的格式不正確。ASP.Net MVC切換初始加載編譯後的文件

我追查下來,並檢查當前線程的文化。 99%的時間是en-US,但是在編譯後的MVC視圖的第一次加載時,它被設置爲en-GB。如果我在此之後立即重新加載頁面,則會回到en-US。

我已經嘗試在web.config文件中設置文化和uiculture來en-US強制它是正確的,但沒有運氣。

任何人對此有任何意見? MVC中的錯誤?

編輯(額外的代碼和嘗試): 即使我去完全過分和包括該基類的視圖

public class DNViewPage<T> : ViewPage<T> where T : class 
    { 

     protected override void OnInit(EventArgs e) { 
      base.OnInit(e); 
      CultureInfo cultureInfo = new CultureInfo("en-US"); 
      this.Culture = "en-US"; 
      this.UICulture = "en-US"; 
      Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      Thread.CurrentThread.CurrentCulture = cultureInfo; 
     } 

     protected void Page_Load(object sender, EventArgs e) { 
      CultureInfo cultureInfo = new CultureInfo("en-US"); 
      this.Culture = "en-US"; 
      this.UICulture = "en-US"; 
      Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      Thread.CurrentThread.CurrentCulture = cultureInfo; 
     } 

     protected override void InitializeCulture() { 

      CultureInfo cultureInfo = new CultureInfo("en-US"); 
      this.Culture = "en-US"; 
      this.UICulture = "en-US"; 
      Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      Thread.CurrentThread.CurrentCulture = cultureInfo; 

      base.InitializeCulture(); 
     } 
    } 

和包括這種在web.config

<globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="en-US" culture="en-US"/> 

並且這在.aspx文件的標題中

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Culture="en-US" UICulture="en-US" 

再次,這是僅在編譯代碼之後的初始加載時,首次加載該頁面時。其他Web表單頁面不受影響,即使它們從System.Web.Mvc.ViewPage下載。隨後的所有負載都能正確處理文化。只需更改.aspx文件不會導致此問題,則必須編譯C#代碼才能實現此目的。

更多數據: 我將它追蹤到Render方法。在Render方法之前,文化是en-US,之後是en-GB(再次僅在編譯後的初始頁面加載中)。

+0

你可以發佈你的web.config,頁面和控制器的代碼,你正在設置的文化?這可能會幫助我們 – Priyank 2011-05-13 16:34:24

+0

添加更多數據以顯示正在發生的事情。 – Jared 2011-05-15 18:37:52

回答

1

事實證明,通過在過時的,第三方.dll文件的依賴造成的。一旦我追查下來,並得到更新的.dll,一切都很好。

0

你是如何將文化設置爲網絡配置的?

你使用的是「全球化」鍵嗎?

看看:

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

+1

是的,我試圖在web.config,頁面和代碼級別設置文化。仍然沒有愛。就像我說的那樣,它在視圖的初始加載後工作正常,但是第一個加載關閉。 – Jared 2010-11-04 15:39:03

1

在您看來,嘗試創建一個基本視圖 - 那麼從它特定視圖繼承爲這裏所做的:How to globalize ASP.NET MVC views (decimal separators in particular)? 但是你會更喜歡:

 
protected override void InitializeCulture() 
{ 
    base.InitializeCulture(); 
    CultureInfo cultureInfo = new CultureInfo("en-US"); 
    Thread.CurrentThread.CurrentUICulture = cultureInfo; 
} 

我認爲全球化關鍵碼正常運行時出現了一些問題。

+0

好主意,但沒有運氣。我已經在上面添加了更多的代碼示例,以顯示我做了什麼,但仍然無法工作。 – Jared 2011-05-15 18:38:22

+0

你的代碼不同於使用initializeculture .....你有沒有專門嘗試重寫? – 2011-05-15 20:38:49

+0

+1我按照這個順序嘗試了它,但沒有去。實際上給了我一個想法,但我追蹤到Render方法。在Render方法之前,文化是en-US,之後是en-GB(再次僅在編譯後的初始頁面加載中)。 – Jared 2011-05-16 22:10:32

0

您是否嘗試過製作底座控制器?我在工作中用應用程序改變了文化,它工作得很好。

public class BaseController : Controller 
{ 
    public string ActionName; 
    public string ControllerName; 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //Switch the language in here? 
     CultureInfo cultureInfo = new CultureInfo("en-US"); 
     this.Culture = "en-US"; 
     this.UICulture = "en-US"; 
     Thread.CurrentThread.CurrentUICulture = cultureInfo; 
     Thread.CurrentThread.CurrentCulture = cultureInfo; 

     base.OnActionExecuting(context); 
    } 
} 
+0

試過這個。沒有運氣。你編譯後是否在初始頁面加載? – Jared 2011-05-16 22:02:01

0

我的第一個觀察你的.aspx頁面中,

你是不是從基本的ViewPage類繼承您的ASPX頁面。嘗試將此添加到您的ASPX頁眉標籤。

Inherits="XXX.Views.DNViewPage<YYY.Models.zzzViewModel>" 

所以它應該是這樣的,

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="XXX.Views.DNViewPage<YYY.Models.zzzViewModel>" %> 
+0

是的,那是在那裏。再次,這對後續頁面加載非常有效。編譯後就不是第一個。 – Jared 2011-05-16 22:02:56