3

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

4

3 回答 3

2

我认为问题在于您如何获得这些日期。您展示了一个使用 MS 日期格式的示例,例如/Date(1357650000000+1100)/它不是标准化的,并且正在慢慢被弃用以支持 ISO8601,它看起来像2013-01-08T13:00:00.000+11:00.

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

这个问题有几种解决方案,客户端和服务器端。这篇文章详细描述了这个问题,并有一些很好的答案可以帮助你。

恕我直言,最好的解决方案是让您的 MVC 控制器发出和使用 ISO8601,而不是旧的 Microsoft 日期格式。最简单的方法是使用Json.Net 库 ,它现在具有 ISO8601 作为默认值,因此您甚至不需要自定义它。在客户端,您可能还想查看Moment.js - 它可以轻松解析和格式化 ISO 日期。

于 2013-04-03T15:01:21.620 回答
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;
    }

希望这有帮助

于 2013-04-03T05:29:07.213 回答
1

感谢马特约翰逊,我能够改变日期被发送到浏览器的方式。这是一个相对简单的修复,取自 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。值得一看,因为它会在您的对象序列化方面做很多繁重的工作。结帐ASP.NET Web API 2 入门

于 2013-04-03T23:24:42.980 回答