私は数週間、KnockoutJs を使用して MVC3 で遊んでいて、何か疑問に思っていました
単純なリストを返す mvc アクションがあるとします
public ActionResult AddFoos()
{
List<Foo> funds = new List<Foo>();
.. etc
return Json(funds.ToList(), JsonRequestBehavior.AllowGet);
}
その後、ビューモデルに渡されます
var viewModel = {
fooChocies: ko.mapping.fromJS([]),
fooOptions: ko.mapping.fromJS([]),
loadInitialData: function () {
ko.mapping.fromJS(serverData, dataMappingOptions, viewModel.fooOptions);
},
};
私のタイプFooには、UI要素を表示または非表示にするプロパティもあります
var Foo = function (data, preselect) {
var self = this;
self.id = ko.observable(data.id);
self.Name = ko.observable(data.Name);
self.number = ko.observable('');
self.showProducts = ko.observable(false); <---
self.displayBigPanel = ko.observable(false); <---
}
これまでの私のアプローチは、フォームの要素を動的に作成することでした
これは ModelBinder を通過し、コントローラー アクションのパラメーターとして List< Foo > を作成します。
最後に質問...
ユーザーがこのページに戻ったら、ユーザーが作成した fooChoices を使用して UI を復元する必要があります。
ユーザー選択の再構築には2つの選択肢があるようです(両方とも拡張メソッドを使用)
見られるように生のjsonを使用します
ko.toJSON(viewModel.fooChoices))
基本的なモデル プロパティに加えて、UI 要素の表示と非表示に関する情報も提供します。
sb.Append("viewModel.fooCghoices= ko.mapping.fromJS(" + json + ");");
sb.Append("ko.applyBindings(viewModel);");
return new HtmlString(sb.ToString());
したがって、クライアントのUI情報をサーバーに送信して戻します
また
ViewModel を直接操作して、実際にユーザー アクションをシミュレートする
sb.Append("viewModel.fooChoices.push(new Foo(1509));"); sb.Append("viewModel.fooChoices()[0].selectedSubFoo = new Foo(273);"); sb.Append("viewModel.fooChoices()[0].showProducts(true);");
どちらの場合も、少しずれているように感じますが、より良いパターンが存在します。ある方法が他の方法よりも優れているか、上記のいずれも優れていないかどうかを知りたいです。
どうもありがとう