私はMVC4を使用しており、knockoutjsライブラリを試しています。Knockoutjs ライブラリを使用せずに従来の [送信] をクリックすると、フォームはコントローラーにデータを送信します。ノックアウトjsマッピングプラグインを使用して、サーバーからビューモデルを変換してクライアント側のビューモデルを作成し、クライアント側で拡張しようとしています。
- サーバー側からクライアント側の vm に変換するために、私は使用しています
ko.mapping.fromJS(model);
- データをサーバーに戻すために、
ko.toJSON(model)
jQueryを使用してajax経由で送信しながら変換しています。
サーバーで受信したデータが null です。ko.toJSON(model)
また、コンソールにログインすると、次のようになります。
{
"FirstName": "foo",
"LastName": "foo1",
"Address": "United Kingdom",
"Age": 22,
"__ko_mapping__": {
"ignore": [],
"include": ["_destroy"],
"copy": [],
"observe": [],
"mappedProperties": {
"FirstName": true,
"LastName": true,
"Address": true,
"Age": true
},
"copiedProperties": {}
}
}
データをサーバーに送信するためにjsオブジェクトをjson形式に変換している間、私は正しくやっていないようです。以下はすべての私のコードです:
コントローラーコード:
public class PersonController : Controller
{
PersonViewModel viewModel = new PersonViewModel();
//
// GET: /Person/
[HttpGet]
public ActionResult Index()
{
return View(viewModel);
}
[HttpPost]
public ActionResult Index(PersonViewModel viewModel)
{
if (ModelState.IsValid)
{
}
return View(viewModel);
}
//
// GET: /Person/LoadData/
public ActionResult LoadData()
{
viewModel = new PersonViewModel() { FirstName = "foo", LastName = "foo1", Age = 22, Address = "United Kingdom" };
return Json(viewModel, JsonRequestBehavior.AllowGet);
}
}
サーバーのビューモデル:
public class PersonViewModel
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string Address { get; set; }
[Required]
public int Age { get; set; }
}
クライアント側の ViewModel - JavaScript :
var Person = function () {
var self = this;
self.SetupKOBindings = function () {
var source = null;
this.GetViewModelFromServer = function () {
$.ajax(
{
url: "/Person/LoadData",
type: "GET",
async: false
}).
success(function (data) {
source = data;
});
}();
return ko.mapping.fromJS(source);
};
self.ViewModel = function () {
this.model = self.SetupKOBindings();
this.model.Save = function () {
console.log(ko.toJSON(model));
$.ajax(
{
url: "/Person/Index",
type: "POST",
data: ko.toJSON(model),
async: true
}).
success(function (data) {
});
}
return this.model;
};
self.ApplyKOBindings = function (vm) {
ko.applyBindings(vm);
};
return this;
};
$(function () {
var PersonPage = Person();
var viewModel = PersonPage.ViewModel();
PersonPage.ApplyKOBindings(viewModel);
});
サーバーの .cshtml の HTML:
<form action="" method="post">
<div>
First Name:
@Html.TextBoxFor(model => model.FirstName, new { data_bind = "value: FirstName,valueUpdate:['afterkeydown','propertychange','input']" })<br />
</div>
<div>
Last Name:
@Html.TextBoxFor(model => model.LastName, new { data_bind = "value: LastName,valueUpdate:['afterkeydown','propertychange','input']" })<br />
</div>
<div>
Address:
@Html.TextBoxFor(model => model.Address, new { data_bind = "value: Address" })<br />
</div>
<div>
Age:
@Html.TextBoxFor(model => model.Age, new { data_bind = "value: Age" })<br />
</div>
<input type="submit" value="Save" data-bind="click: Save"/>
</form>