淘汰赛日期被重置后发送到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