gpt4 book ai didi

jquery - 在 MVC 3 应用程序中,如何执行 DateTimes 和 TimeSpans 的简单 AJAX/JSON 往返?

转载 作者:行者123 更新时间:2023-12-01 07:31:47 33 4
gpt4 key购买 nike

给定一个简单的往返场景,如何将 JSON 数据返回到浏览器,然后通过 ModelBinds 到具有 3 个属性的类型(Int32、DateTime、TimeSpan)的 JSON 接受来自浏览器的更新?

服务器代码( Controller )

    public class Product
{
public int Id { get; set; }
public DateTime Start { get; set; }
public TimeSpan Duration { get; set; }
}

[AcceptVerbs(HttpVerbs.Get)]
public JsonResult data()
{
return Json(
new Product {
Id = 1, Start = DateTime.Now,
Duration = TimeSpan.FromMinutes(30)}
, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public void data(Product product)
{
//product is not bound; modelbinder fails on DateTime and TimeSpan
Console.WriteLine("Data: " + product);
}

立即窗口中的错误

ModelState["Start"].Errors[0]
{System.Web.Mvc.ModelError}
ErrorMessage: "The value '/Date(1302295231115)/' is not valid for Start."
Exception: null

ModelState["Duration"].Errors[0]
{System.Web.Mvc.ModelError}
ErrorMessage: "The Duration field is required."
Exception: null

客户端代码(getData和changeData绑定(bind)到2个不同的按钮)

<script type='text/javascript'>
var myData;
function getData(event)
{
$.getJSON('/home/data', function (data)
{
myData=data;
console.dir(data);
});
}

function changeData(event)
{
var postData = JSON.stringify(myData);

$.ajax({
url: '/home/data',
type: "POST",
data: postData,
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function () {
console.log('success!');
},
error: function () {
console.log('fail!');
}
});
}

$(document).ready(function ()
{
$('#get').click(getData);
$('#post').click(changeData);
}
</script>

<body>
<button id="get" onclick="return(false);">get</button>
<button id="post" onclick="return(false);">post</button>
</body>

2012 年 3 月更新

看起来像是即将推出的Microsoft WebAPI will serialize to ISO8601感谢 Scott Hanselman 和 James Newton-King

最佳答案

处理日期的方式存在问题。 JavaScriptSerializer处理日期时使用以下格式: /Date(1302296382818)/ 不幸的是,在解析 GET JSON 响应时,这对 jQuery 没有什么意义,因此您在客户端无法获得真正的日期,而是字符串。因此,您需要无耻的黑客才能将此字符串转换为真实日期:

myData.Start = new Date(parseInt(data.Start.substr(6)));

这是黑客攻击的完整故事:

型号:

public class Product
{
public int Id { get; set; }
public DateTime Start { get; set; }
}

Controller :

public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult Data()
{
var product = new Product
{
Id = 1,
Start = DateTime.Now,
};
return Json(product, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public ActionResult Data(Product product)
{
return Json(product);
}
}

查看:

<script type="text/javascript">
var myData;

function getData(event) {
$.getJSON('/home/data', function (data) {
myData = data;
myData.Start = new Date(parseInt(data.Start.substr(6)));
});
return false;
}

function changeData(event)
{
var postData = JSON.stringify(myData);

$.ajax({
url: '/home/data',
type: 'POST',
data: postData,
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (result) {
console.log(result);
}
});

return false;
}

$(function () {
$('#get').click(getData);
$('#post').click(changeData);
});
</script>

<button id="get">get</button>
<button id="post">post</button>

TimeSpan 案例留给读者作为练习,因为它将需要另一次无耻的黑客攻击,而我厌倦了黑客攻击:-)

关于jquery - 在 MVC 3 应用程序中,如何执行 DateTimes 和 TimeSpans 的简单 AJAX/JSON 往返?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600510/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com