4

ASP.NET MVC コントローラーで Json() メソッドを使用すると問題が発生します。このメソッドでスローされるすべての DateTime は、サーバー時間を使用して UTC に変換されます。

さて、ASP.NET MVC Json Serializer に DateTime から UTC への自動変換を停止するように指示する簡単な方法はありますか? この質問に記載されているように、各変数を DateTime.SpecifyKind(date, DateTimeKind.Utc) で再署名するとうまくいきますが、明らかに、すべての DateTime 変数でこれを手動で行うことはできません。

それで、Web.configで何かを設定して、JSONシリアライザーにすべての日付をUTCであるかのように扱わせることは可能ですか?

4

1 に答える 1

3

くそー、最近、私はここ StackOverflow で自分の質問に答える運命にあるようです。ため息、ここに解決策があります:

  1. NuGet を使用して ServiceStack.Text をインストールします。JSON シリアル化を無料で高速化できます (どういたしまして)。
  2. ServiceStack.Text がインストールされたら、ベース コントローラーで Json メソッドをオーバーライドするだけです (1 つあるはずですよね?)。

    protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
    {
        return new ServiceStackJsonResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding
        };
    }
    
    public class ServiceStackJsonResult : JsonResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
    
            if (ContentEncoding != null)
            {
                response.ContentEncoding = ContentEncoding;
            }
    
            if (Data != null)
            {
                response.Write(JsonSerializer.SerializeToString(Data));
            }
        }
    }  
    
  3. このシリアライザーはデフォルトで「正しいこと」を行っているようです.DateTime.Kindが指定されていない場合、DateTimeオブジェクトを台無しにしません. ただし、Global.asax でいくつかの追加の構成調整を行いました (ライブラリの使用を開始する前に、その方法を知っておくとよいでしょう)。

    protected void Application_Start()
    {
        JsConfig.DateHandler = JsonDateHandler.ISO8601;
        JsConfig.TreatEnumAsInteger = true;
    
        // rest of the method...
    }
    

このリンクは役に立ちました

于 2013-02-20T06:46:13.993 に答える