カスタムMVCのControllerのJson変換器による日付シーケンス化フォーマットの問題の解決

2666 ワード

今日、MVCフレームワークの下でEasyUIのdatagridを使用してデータをロードする場合、サービス側が返すJson日付フォーマットは/Date(14308800000+0800)/であり、クライアントのさらなる変換が必要であり、EasyUIでよく使われる日付フォーマットの要求にも合致しないため、MVCフレームワークの下でのControllerについていくつかの検討を行った.この問題はControllerのJsonメソッドを拡張することで解決でき,さらにシーケンス化クラスをカスタマイズすることで,任意のタイプのデータのシーケンス化フォーマット要件を満たすことができることが分かった.
この目標を達成するには、次の3つのステップを実行する必要があります.
1、Controllerの派生クラスを作成し、カスタムJsonResultを導入する
2、JsonResultの派生クラスを作成し、Json日付フォーマットのカスタム実現を実現する
3、カスタム日付シーケンス化フォーマットを必要とするすべてのコントローラは、上記のControllerの派生クラスに継承する必要がある
具体的なコード実装例は以下の通りである.
/// 
///     ExecuteResult  ,             
/// 
public class VMEJsonResult : JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;
        if (this.Data != null)
        {
            JsonSerializerSettings setting = new JsonSerializerSettings();
            //           
            setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            response.Write(JsonConvert.SerializeObject(Data, setting));
        }
    }
}

///     
///     Controller           Json      
/// 
public class VMEController : Controller
{
    protected override JsonResult Json(object data, string contentType, Encoding contentEncoding)
    {
        return new VMEJsonResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding };
    }
    public new JsonResult Json(object data, JsonRequestBehavior jsonRequest)
    {
        return new VMEJsonResult { Data = data, JsonRequestBehavior = jsonRequest };
    }
    public new JsonResult Json(object data)
    {
        return new VMEJsonResult { Data = data, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
}

/// 
///                     ,     VMEController
/// 
public class CouponController : VMEController
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult GetAllCouponTypes()
    {
        Hashtable hashtable = new Hashtable();
        hashtable["sessionId"] = "";

        string json = JsonHelper.Serialize(hashtable);

        string retJson = HttpHelper.PostForJson("http://localhost/vme", "CouponService.svc", "GetAllCouponTypes", json);
        string jsonResult = JsonHelper.GetString(retJson);
        List results = JsonHelper.DeserializeObject>(jsonResult);

        return Json(results, JsonRequestBehavior.AllowGet);
    }
}