MVC4用に書かれたPluralsight 'Parent-Child with EF、MVC、Knockout'コースに従っています。私はMVCコアに対して取り組んでいます。私は、サーバー上のPOSTのモデルバインドの問題だと思っています。MVCコアからKnockoutJSのモデルバインド
マイコントローラー:
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は '有効' に来ているが、すべての値がnullです。
私のAJAX呼び出し: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);
}
});
}
};
にconsole.logは次のようになりますいるFormData上のChromeの報告書を確認する
postback data: {"SalesOrderId":0,"CustomerName":null,"PONumber":null}
は示しています {"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":{}}}
console.logsを前に-postはいくつかの奇妙なことを示しています: '自己'対 'ko.toJSON(自己)'しかし、私はKOに精通していないので、それがどれほど奇妙であるかは分かりません。
私は地元の人々ウィンドウ('((Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest)this.Request).Form' threw an exception of type 'System.InvalidOperationException')
で見た結合およびエラーメッセージをモデル化するために関連したカップルの質問を見てきました。
headers: {
"ContentType": "application/json"
},
に
contentType: "application/json"
を変更
は、ローカルのエラーをなくすが、動作は変更されませんでした。コントローラのモデルはまだヌル値を示しています。
もう一つの答えは、署名に '[FromBody]'( 'FromForm')を追加することを提案しました。あなたができることを望んでいる!
あなたはAJAXコールバックでログデータをコンソールことはできますか?コントローラからコードを見ることもできますか? –
これを試したことがありますか?public JsonResult Save([FromBody] SalesOrderViewModel salesOrderViewModel) – Chris
また、SalesOrderViewModelコードを投稿すると、それをフォームデータ値と比較して、すべての変数名がバインディングに一致することを確認できます。 – Chris