2013-04-03 48 views
3

我有一個淘汰賽/ mvc3應用程序。我將這個日期傳回給一個控制器。淘汰賽日期被重置後發送到mvc控制器

控制器

public ActionResult PackageUpdate(Package updatePackage){ 
\\do some stuff but dates are set to zero? 
} 

視圖模型和保存方法

var Package = function (data) { 
    self = this; 
    self = ko.mapping.fromJS(data); 
    self.save = function(){ 
     $.ajax({ 
      url: '/MediaSchedule/PackageUpdate', 
      data:ko.toJSON({ updatePackage: self }) 
     }).success(function (results) { 
      console.log(results); 
     }).error(function (er) { 
      console.error('Ah damn you broke it.') 
      console.log(er); 
     }); 
    } 
    return self; 
} 

的Json傳遞

{"updatePackage":{"Id":"82e3bc7e-27b8-49c2-b1fa-1ee2ebffbe66","Name":"28a38","SecondaryName":"è€å­æˆ‘è¦é’±","IsLocked":true},"DateCreated":"/Date(1357650000000+1100)/","DateStart":"/Date(1365080400000+1100)/","DateEnd":"/Date(1365516000000+1000)/"} 

ID,名稱和其他屬性正在通過,但日期正在重置爲{1/1/0001 12:00:00 AM}。我的假設是因爲它沒有被反序列化,它正在設定一個最短日期。問題:如何正確反序列化我的日期。

+0

此答案由達林應該有所幫助。 http://stackoverflow.com/a/3940464/243694 –

+0

是有辦法做到這一點,而無需繳納對象的每個屬性。我已經刪除了一些屬性,但大約有15個。還有兩個數組,每個數組都包含具有開始/結束/創建日期的對象。 – Kieran

+0

該建議也意味着手動拆包敲除對象。我想避免的事情。 – Kieran

回答

2

我認爲問題在於如何獲得這些日期開始。您將使用MS日期格式顯示一個示例,如/Date(1357650000000+1100)/,該格式不是標準化的,並且正逐漸被棄用,轉而使用ISO8601,該格式看起來像2013-01-08T13:00:00.000+11:00

確實,當您使用ISO8601格式的對象時,它使用了一個javascript Date。這也發生在ko.mapping.toJSON

這個問題有幾種解決方案,客戶端和服務器端。 This post詳細描述了這個問題,並且有一些很好的答案可以幫助你。

恕我直言,最好的解決方案是讓您的MVC控制器發出並消耗ISO8601而不是舊的Microsoft日期格式。最簡單的方法是使用Json.Net librarywhich now has ISO8601 as the default,所以你甚至不需要定製它。在客戶端,你可能也想看看Moment.js - 這可以很容易地解析和格式化ISO日期。

+0

是的,謝謝。這是我的問題的原因。在將日期發送到javascript/knockout應用之前,日期變得更容易處理。謝謝。 – Kieran

1

我認爲它只是你推送給你的數據類型updatePackage對象。 以下是我的代碼,運行良好,我用讀jQuery的日期選擇器日期和使用格式爲 'DD MM,YY'(2013 01月01日)

var iEndInsuredDate = $('#dpkEndInsuredDate').val(); 
      var iEndPolicyDate = $('#dpkEndPolicyDate').val(); 

      $.ajax({ 
       url: '@Url.Action("DeleteClientMember", "ClientMember")', 
       type: "POST", 
       dataType: "json", 
       data: { clientMemberID: id, endInsuredDate: iEndInsuredDate, endPolicyDate: iEndPolicyDate }, 
       success: function (result) { 
        ShowWaiting("Reloading..."); 
        Search(1); 
       } 
      }); 

和我的ActionResult

public ActionResult DeleteClientMember(int clientMemberID, DateTime? endInsuredDate, DateTime? endPolicyDate) 
    { 
     ClientMember model = clientMemberService.GetById(clientMemberID); 

     //model.EndPolicyDate = endPolicyDate; 
     model.EndInsuredDate = endInsuredDate; 
     foreach (ClientMemberProduct item in model.ProductList) 
     { 
      item.EndDate = endInsuredDate; 
     } 
     model.IsActive = false; 
     model.ActionStatus = ClientMemberActionStatus.PendingDelete.ToString(); 
     clientMemberService.CalculateInsFee(model); 
     clientMemberService.Update(model); 
     return null; 
    } 

希望這個幫助 方面

+0

感謝您的嘗試,但我期待將視圖模型發回到服務器而不是單個屬性。問題在於日期未按預期反序列化。 – Kieran

1

感謝Matt Johnson我能夠改變日期發送到瀏覽器的方式。這是一個從寂滅戴夫回答採取了類似的問題 與ASP.NET MVC JsonResult Date Format

一個relativly容易解決我的JsonNetResult類現在看起來像

public class JsonNetResult : ActionResult 
{ 
    private const string _dateFormat = "yyyy-MM-dd hh:mm:ss"; 

    public Encoding ContentEncoding { get; set; } 
    public string ContentType { get; set; } 
    public object Data { get; set; } 

    public JsonSerializerSettings SerializerSettings { get; set; } 
    public Formatting Formatting { get; set; } 

    public JsonNetResult() 
    { 
     SerializerSettings = new JsonSerializerSettings(); 
     Formatting = Formatting.Indented; 
     SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     HttpResponseBase response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(ContentType) 
      ? ContentType 
      : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     if (Data != null) 
     { 
      var isoConvert = new IsoDateTimeConverter(); 
      isoConvert.DateTimeFormat = _dateFormat; 

      JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 

      JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Converters.Add(isoConvert); 

      serializer.Serialize(writer, Data); 

      writer.Flush(); 
     } 
    } 
} 

我已經添加了ISO日期轉換到serizer

您調用它的控制器:

public JsonNetResult YourAction(){ 
    //your logic here 
    return JsonNetResult(/*your object here*/); 
} 

當我寫這個時,我不知道Web API 。這是值得一看的,因爲它會在你的對象序列化時做很多繁重的工作。結帳Getting Started with ASP.NET Web API 2

+0

我非常喜歡這個選項,但是如何從JsonNetResult返回一個值?我試圖做標準返回Json(數據),但得到一個錯誤,它不能轉換爲JsonResult類型。謝謝 –

+0

@SeanHaddy我已經添加了如何得到結果。如果你能夠,我也會看看使用網頁API。當涉及到json/xml序列化時,它爲你做了很多繁重的工作。 – Kieran

+0

謝謝,不幸的是我已經嘗試過......它聲明「JsonNetResult」是一種類型,但是像變量一樣使用。 –