淘汰赛日期被重置后发送到mvc控制器

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


我认为问题在于你如何获得这些日期。 您将使用MS日期格式(例如/Date(1357650000000+1100)/进行示例,该日期格式不是标准化的,并且正在逐渐弃用ISO8601,该格式看起来像2013-01-08T13:00:00.000+11:00

事实上,当你JSON.stringify一个javascript Date对象时,它使用ISO8601格式。 这也发生在ko.mapping.toJSON

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

恕我直言,最好的解决方案是让您的MVC控制器发出并消耗ISO8601而不是旧的Microsoft日期格式。 最简单的方法是使用JSON.Net库,现在已将ISO8601作为默认值,因此您甚至不需要对其进行定制。 在客户端,你可能也想看看Moment.js - 这可以很容易地解析和格式化ISO日期。


我认为它只是你推送给你的数据类型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;
    }

希望这有助于Regard


感谢马特约翰逊,我能够改变日期被发送到浏览器的方式。 这是一个相对简单的修复从易腐Dave回答到与ASP.NET MVC JsonResult日期格式类似的问题

我的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。 这是值得一看的,因为它会在你的对象序列化时做很多繁重的工作。 Checkout ASP.NET Web API入门2

链接地址: http://www.djcxy.com/p/48133.html

上一篇: knockout dates being reset on post to mvc controller

下一篇: ASP.NET MVC Core/6: Multiple submit buttons