我有一个向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脚本附加到其click事件中。
<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中的“保存”按钮以触发发布请求。
我在控制器中设置调试断点并验证即将发布的请求。在ASP.NET 4.5中,JSON反序列化正在运行,它显示了所有值。
但是,在ASP.NET 5中,返回一个空对象。
在ASP.NET 5的情况下,如果按F12在Microsoft Edge中启动调试器,则表明Post请求确实具有正确的值,但由于某些原因,它们不会传递给MVC控制器。
请看这些屏幕截图: http://i63.tinypic.com/68vwnb.jpg
我错过了什么吗? 谢谢你的帮助...
答案 0 :(得分:0)
我认为您不需要指定参数的名称。试试:
var salesOrderViewModel = {
"SalesOrderId": 123,
"CustomerName": "ab",
"PONumber": "2",
}
答案 1 :(得分:0)
我认为您需要在控制器中指定fromBody。
[HttpPost]
public JsonResult Save([FromBody]SalesOrder salesOrderViewModel)
{
salesOrderViewModel.CustomerName = "David returns";
return Json(new { salesOrderViewModel });
}
答案 2 :(得分:0)
感谢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”不是问题。有了它,脚本仍然有效。
实际上,这个问题是我原始问题的简化版本。我最初的问题是从淘汰赛开始。下面是执行数据绑定的脚本。用户单击“保存”按钮后,将调用self.save函数(),脚本会将包含数据模型的发布请求发送到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 ”开始的所有数据都是KnockoutJs特有的。我是否需要手动修剪这些数据才能使其正常工作?根据信息,显然相同的实现应该在ASP.NET 4.5中起作用,但我还没有尝试过。非常感谢......