我已经用 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。
似乎我有两个选择来重建用户选择(都通过扩展方法)
使用原始 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);");
无论哪种情况,它都感觉有点不对劲,而且有更好的模式。想知道一种方法是否比另一种更好,或者以上都没有。
非常感谢