淘汰日期被重置在mvc控制器的帖子上

时间:2013-04-03 03:58:23

标签: asp.net-mvc json asp.net-mvc-3 datetime knockout.js

我有一个淘汰/ mvc3应用程序。我将日期传递回控制器。

控制器

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}。我的假设是因为它没有被反序列化它正在设置一个最小日期。问题:如何正确地将我的日期反序列化。

3 个答案:

答案 0 :(得分:2)

我认为问题在于你如何获得这些日期。您使用MS日期格式(例如/Date(1357650000000+1100)/)显示了一个示例,该格式未标准化,并且正在慢慢弃用,而ISO8601看起来像2013-01-08T13:00:00.000+11:00

实际上,当您JSON.stringify javascript Date对象时,它会使用ISO8601格式。这也发生在ko.mapping.toJSON

这个问题有几种解决方案,包括客户端和服务器端。 This post详细描述了这个问题,并提供了一些可以帮助您的好答案。

恕我直言,最好的解决方案是让您的MVC控制器发出并使用ISO8601而不是旧的Microsoft日期格式。最简单的方法是使用Json.Net library which now has ISO8601 as the default,这样您甚至无需自定义它。在客户端,您可能还需要查看Moment.js - 这样可以轻松解析和格式化ISO日期。

答案 1 :(得分:1)

我认为它只是你推送给updatePackage对象的数据类型。 以下是我的代码并运行良好,我使用从jQuery Datepicker读取日期并使用格式为'dd MM,yy'(2013年1月1日)

 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;
    }

希望这有帮助 方面

答案 2 :(得分:1)

感谢Matt Johnson我能够更改日期发送到浏览器的方式。这是一个相对容易的解决方案,从Perishable Dave回答类似的问题 ASP.NET MVC JsonResult Date Format

我的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