2

日付プロパティを含むオブジェクトを受け取る webmethod があります。オブジェクトを表す json を webmethod に渡しています。asp.net は自動的に json 文字列をオブジェクトに変換するため、私のメソッドは次のようになります。

[WebMethod]
public static Object Save(MyObject item)
{
   ....
}

public class MyObject 
{
     DateTime date;
     .....
}

日付が USA 形式で送信された場合、これはすべて正常に機能します。'MM/dd/yyyy' 日付がヨーロッパ形式で送信された場合:'dd/MM/yyy'エラーが表示されます。

グローバル asax でスレッドのカルチャを設定しています。

void Application_AcquireRequestState(object sender, EventArgs e)
{
     var s = GetSessionValues();
     System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(s.CultureID);
     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(s.CultureID);
}

このコードは正しく実行され、セッションからカルチャ ID を読み取って設定します。カルチャ ID は、データベースからのログイン時にセッションに読み込まれます。

しかし、これはエラーを受け取る Web メソッドで期待される日付形式には影響しないようです:

"31/08/2012 is not a valid value for DateTime.",
"StackTrace":"  
at System.ComponentModel.DateTimeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer)\r\n  
at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)\r\n  
at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n  
at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n  
at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.FormatException"}

Web メソッドの予想される日付形式を設定するにはどうすればよいですか (これらの Web メソッドがたくさんあるので、明らかにそれらすべてに適用されるソリューションが必要です)。

ありがとう

4

4 に答える 4

10

日付プロパティを含むオブジェクトを受け取る webmethod があります。オブジェクトを表す json を webmethod に渡しています。asp.net は自動的に json 文字列をオブジェクトに変換します

JSON を受け入れていることを考えると、これはカルチャに依存する IMO であってはなりません。すべてのデータ (数値と日付/時刻を含む) をクライアント側でカルチャに依存しない形式に変換します。

そのため、UI で日付入力を受け入れる場合は、JavaScript を取得してそれをローカルで日付/時刻オブジェクトに変換してから、使用する特定の形式に変換します。(個人的にはyyyy-MM-ddTHH:mm:ss.fffZ、明確なフォーマットとして使用することをお勧めしますが、これで終わりです。)

JSON は、たまたま人間にとっても読みやすい、機械可読のシリアライゼーション形式と考えてください。クライアント側ですべての文化固有の解析を維持すると、作業がはるかに簡単になります。

編集: 基本的に、JSON の値が何を意味するかを理解する必要があります。人間が消費するテキストの場合は、文字列として扱い、解析しようとせず、表示したいカルチャで生成してください。マシンが使用する日付/時刻の値である場合は、そのように扱い、カルチャに中立な方法 (固定形式、不変のカルチャ) で生成します。値を人間が読み取れるものと機械が読み取れるものを混在させようとすると、このような問題が発生します。

于 2013-01-20T13:55:59.243 に答える
2

パラメータタイプを文字列に変更してから、その文字列を任意のタイプに変換できます

public void Save(MyObject itemdate){
    *Code*
}
public class MyObject 
{
     string date;
     .....
}

すなわち:

DateTime myEurpeonDate= DateTime.ParseExact(MyObject.date, "dd/MM/yyyy", null);
于 2013-01-20T10:50:34.007 に答える
1

web.configcultureで とuiCultureを設定してみてください:en-GB

<system.web>
    <globalization culture="en-GB" uiCulture="en-GB" />
<system.web>
于 2013-01-20T09:42:51.463 に答える
0

TryParseまたはDateTimeまたはDateTimeOffset型のParseメソッドを呼び出して、変換を試みます。その中でCultureInfoオブジェクトも使用します。以下に良い例を示します..

こちらも参考になるかも..

于 2013-01-20T11:05:04.153 に答える