1

Вопрос web.config:DateTime.Parse с использованием культуры ан-нас, несмотря на настройки

в web.config в разделе

system.web 

Я имею

<globalization culture="de-ch" uiCulture="de-ch" requestEncoding="UTF-8" responseEncoding="UTF-8"/> 

То, что я хочу для синтаксического анализа такой строки

"20.03.2012 00:00:00" 

до значения даты и времени

но

DateTime dtAsIs = DateTime.Parse("20.03.2012 00:00:00") 

бросает исключение

К сожалению, только на TestServer, а не на моей системе развития. У меня нет доступа к серверу testerver, за исключением того, чтобы скопировать webapp в share.

я могу воспроизвести исключение вроде этого:

DateTime dtThrowsException = DateTime.Parse("20.03.2012 00:00:00",new System.Globalization.CultureInfo("en-us")); 

В то время как он работает отлично, как это:

DateTime dtWorks = DateTime.Parse("20.03.2012 00:00:00",new System.Globalization.CultureInfo("de-ch")); 

Я проверил страницу ASP, и нет никакой культуры установлен в осины странице

(я имею в виду это:

<% @Page Culture="fr-FR" Language="C#" %> 

)

Если установить

System.Threading.Thread.CurrentThread.CurrentCulture 

и

System.Threading.Thread.CurrentThread.CurrentUICulture 

де-ч в самом начале Page_Load как этот

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-ch"); 
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-ch"); 

то он работает отлично.

Язык браузера установлен на «de-ch», я проверил это.

Может ли кто-нибудь сказать мне, почему нить-культура настроена на английский?

Я имею в виду очевидную причину, что серверная операционная система - английский, но я не могу изменить ее, только настройки в web.config.

ответ

1

Проблема заключается в том, что ASP.NET перезаписывает культуру, даже когда вы явно указываете ее. (Как

DateTime.Parse("Whatever", New System.Globalization.CultureInfo("de-ch")) 

)

нужно заставить переопределить его

New System.Globalization.CultureInfo("de-ch", False) 




Так что для того, чтобы сделать его настраиваемым и изменить его как можно, вам нужно получить культуру от web.config с

System.Globalization.CultureInfo.CurrentCulture.Name 

, а затем принудительно установить его с

DateTime.Parse("Whatever", New System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, False)) 

Обратите внимание на перегрузки с ложным, это необходимо, в противном случае он действительно не работает.

Вот мое решение:

Namespace ASP.NET.Sucks 
    Public Class PageWithCorrectPageCulture 
     Inherits Web.UI.Page 

     Protected Sub New() 
      System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, False) 
      System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, False) 
     End Sub 

    End Class 
End Namespace 

Затем в коде, заменить System.Web.UI.Page с PageWithCorrectPageCulture

Partial Class whateverpage 
    Inherits PageWithCorrectPageCulture 
    'Inherits System.Web.UI.Page 

А для тех, кто может только скопировать Pase C#:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
namespace ASP.NET.Sucks 
{ 
    public class PageWithCorrectPageCulture : Web.UI.Page 
    { 

     protected PageWithCorrectPageCulture() 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, false); 
      System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, false); 
     } 

    } 
} 
+0

Вместо того, чтобы устанавливать это на каждой странице, вы можете установить в '' '' Begin_Request'' '' '' Global.asax.cs''', и он будет работать так же. –

1

У меня такой же опыт, как и вы, кажется, что тег глобализации в web.config просто игнорируется. Но так как вы всегда хотите анализировать даты в культуре de-ch, я не вижу, что не так, просто предоставляя культуру методу DateTime.Parse (некоторые рекомендации говорят, что это самое лучшее, что нужно сделать в любом случае)

+0

Проблема заключается в том, что у меня нет времени заменять ее повсюду («только» от 1000 до 10 000 включений, распространяемых по широкий диапазон страниц и шаблонов ...). Сейчас я пытаюсь исправить это путем наследования с пользовательской страницы и установить CurrentCulture до OnInit. –

+0

Он все еще игнорировал это, когда я устанавливал культуру в Date.Parse. Но теперь у меня есть решение ... См. Мой ответ. –