我有一个向MVC控制器发送JSON post请求的示例。此示例适用于ASP.NET 4.5,但在最新的ASP.NET 5版本中不起作用。这个例子中我遗漏了什么吗?
-
我创建了一个模型,但并没有将其绑定到数据库。它将只是在内存中创建的对象。
public class SalesOrder { public int SalesOrderId { get; set; } public string CustomerName { get; set; } public string PONumber { get; set; } }
-
我使用Visual Studio 2015创建了那个基于模型的控制器及其相关的CRUD视图。但是,在本例中,我将只运行"创建"视图。
-
在控制器中,我硬编码了一个SalesOrder对象列表,它只包含一个项目。我将使用它来处理CRUD视图。
private List<SalesOrder> salesOrderList = new List<SalesOrder> ( new SalesOrder[] { new SalesOrder() { SalesOrderId = 1, CustomerName = "David", PONumber = "123" } });
-
在控制器内部,我还创建了一个新函数来处理"保存"请求。该请求只会更改模型的CustomerName属性,然后返回JSON结果。
[HttpPost] public JsonResult Save(SalesOrder salesOrderViewModel) { salesOrderViewModel.CustomerName = "David returns"; return Json(new { salesOrderViewModel }); }
-
在Create.cshtml中,我创建了一个按钮,并将JQuery脚本附加到它的点击事件中。
<p><button id="saveButton">Save</button></p>
这是JQueryScript。
$(function () {
var clickFunc = function () {
var salesOrderViewModel = {
"salesOrderViewModel": {
"SalesOrderId": 123,
"CustomerName": "ab",
"PONumber": "2",
}
}
$.ajax({
url: "/SalesOrders/Save/",
type: "POST",
cache: false,
data: JSON.stringify(salesOrderViewModel),
contentType: "application/json; charset=utf-8"
});
}
$('#saveButton').click(clickFunc)
})
我点击Create.cshtml中的"保存"按钮来触发发布请求。
我在控制器中设置了调试断点,并验证即将到来的post请求。在ASP.NET 4.5中,JSON反序列化正在工作,它显示了所有值。
但是,在ASP.NET 5中,会返回一个空对象。
在ASP.NET 5的情况下,如果按F12在Microsoft Edge中启动调试器,则会显示Post请求确实具有正确的值,但由于某些原因,这些值不会传递给MVC控制器。
请查看以下屏幕截图:http://i63.tinypic.com/68vwnb.jpg
我错过什么了吗?感谢您的帮助…
我认为您不需要指定参数的名称。尝试:
var salesOrderViewModel = {
"SalesOrderId": 123,
"CustomerName": "ab",
"PONumber": "2",
}
我认为您需要特别注意控制器中的Body。
[HttpPost]
public JsonResult Save([FromBody]SalesOrder salesOrderViewModel)
{
salesOrderViewModel.CustomerName = "David returns";
return Json(new { salesOrderViewModel });
}
感谢DCruz22和Stephen Muecke。脚本的工作版本是:
$(function () {
var clickFunc = function () {
var salesOrderViewModel = {
"salesOrderViewModel": {
"SalesOrderId": 0,
"CustomerName": "ab",
"PONumber": "2",
"MessageToClient": "POST to server"
}
}
$.ajax({
url: "/SalesOrders/Save/",
type: "POST",
cache: false,
data: salesOrderViewModel
});
}
$('#saveButton').click(clickFunc)
})
我发现参数名称"salesOrderViewModel"不是问题。有了它,剧本仍然有效。
实际上,这个问题是我原来问题的简化版。我最初的问题是从击倒Js开始。下面是执行数据绑定的脚本。用户点击"保存"按钮后,self.Save函数()被调用,脚本会将包含数据模型的post请求发送到MVC控制器。
SalesOrderViewModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.save = function () {
$.ajax({
url: "/SalesOrders/Save/",
type: "POST",
cache: false,
data: ko.toJSON(self),
success: function (data) {
}
});
}
}
问题是"ko.toJSON(self)"包含了一些其他信息。以下是我从Microsoft Edge调试器捕获的请求正文。
{"SalesOrderId":0,
"CustomerName":"chiang123",
"PONumber":"123",
"MessageToClient":null,
"__ko_mapping__":{
"ignore":[],
"include":["_destroy"],
"copy":[],
"mappedProperties":{
"SalesOrderId":true,
"CustomerName":true,
"PONumber":true,
"MessageToClient":true}}}
您可以看到从"ko_mapping"开始的所有数据都是特定于KnockoutJ的。我需要手动修剪这些数据吗?根据信息,显然同样的实现应该在ASP.NET 4.5中工作,但我只是还没有尝试过。非常感谢。。。