【发布时间】:2018-05-12 10:21:18
【问题描述】:
我正在学习为 MVC4 编写的 Pluralsight“使用 EF、MVC、淘汰赛的亲子”课程。我正在针对 MVC Core 工作,并且正在努力解决我认为在 POST 回到服务器上的模型绑定问题。
我的控制者:
public JsonResult Save(SalesOrderViewModel salesOrderViewModel)
{
if (ModelState.IsValid)
{
var salesOrder = new SalesOrder();
salesOrder.CustomerName = salesOrderViewModel.CustomerName;
salesOrder.PONumber = salesOrderViewModel.PONumber;
_context.SalesOrder.Add(salesOrder);
_context.SaveChanges();
return Json(JsonConvert.SerializeObject(salesOrderViewModel));
}
else
{
return Json(JsonConvert.SerializeObject(ModelState));
}
}
//ModelState 进入 'Valid' 但所有值均为空。
我的 ajax 调用:
SalesOrderViewModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
console.log(self);
self.save = function () {
console.log(self);
console.log(ko.toJSON(self));
debugger;
$.ajax({
url: "/Sales/Save/",
type: "POST",
data: ko.toJSON(self),
headers: {
"contentType": "application/json"
},
success: function (data) {
if (data.salesOrderViewModel)
ko.mapping.fromJS(data.salesOrderViewModel, {}, self);
},
always: function (data) {
console.log(data);
}
});
}
};
关于 ajax 回发的console.log 是:
postback data: {"SalesOrderId":0,"CustomerName":null,"PONumber":null}
检查 Chrome 的 FormData 报告显示:
{"SalesOrderId":0,"CustomerName":"Steve","PONumber":"PO","MessageToClient":null,"__ko_mapping__":{"ignore":[],"include":["_destroy"],"copy":[],"observe":[],"mappedProperties":{"SalesOrderId":true,"CustomerName":true,"PONumber":true,"MessageToClient":true},"copiedProperties":{}}}
pre-post 上的console.logs 显示了一些奇怪:'self' vs. 'ko.toJSON(self)' 但我不熟悉 KO,所以不确定它有多奇怪。
我看到了几个与模型绑定相关的问题以及我在本地窗口('((Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest)this.Request).Form' threw an exception of type 'System.InvalidOperationException') 中看到的错误消息。
变化
contentType: "application/json"
到
headers: {
"ContentType": "application/json"
},
消除了 Locals 中的错误,但没有改变行为。控制器的模型仍然显示空值。
另一个答案建议在签名中添加“[FromBody]”(也称为“[FromForm]”)——两者都没有帮助我。希望你能!
【问题讨论】:
-
你能在 ajax 回调中控制日志数据吗?我们也可以从控制器中看到代码吗?
-
你试过了吗:public JsonResult Save([FromBody]SalesOrderViewModel salesOrderViewModel)
-
另外,如果您发布了您的 SalesOrderViewModel 代码,您可以将其与表单数据值进行比较,以确保所有变量名称都与绑定匹配。
-
我也会在你的 JsonResult 上方添加这个保存:[HttpPost("[action]")]
-
我很确定我在删除 ("[action]") 之前尝试了所有可能的组合,并且只使用了有效的 [HttpPost]。
标签: knockout.js asp.net-core-mvc