2013-04-03 49 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”是一种类型,但是像变量一样使用。 –