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