我正在传递以下 C# AjaxViewModel 模型:
namespace Db.ViewModels
{
public class DbAjaxViewModel
{
public DbAjaxViewModel() {
Products = new List<DbProductViewModel>();
}
public List<DbProductViewModel> Products { get; set; }
}
public class DbProductViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Price { get; set; }
public string CategoryId { get; set; }
}
}
..使用以下代码:
[HttpGet]
public ActionResult GetProductsAjax() {
var viewModel = _service.GetAllProductsAjaxViewModel();
return new JsonResult { Data = viewModel, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
然后我做ko映射:
function callBack(result) {
sprAdmin.product.viewModel = ko.mapping.fromJS(result);
ko.applyBindings(sprAdmin.product.viewModel, $("adminProductWrap")[0]);
}
$.ajax({
type: "GET",
url: url,
success: callBack
});
而且效果很好。我有这个函数可以向我的 viewModel 添加一个空项目:
addProduct: function () {
function product() {
this.Id = ko.observable("-1");
this.CategoryId = ko.observable("0");
this.Name = ko.observable("");
this.Description = ko.observable("");
this.Price = ko.observable("0");
}
debug.debug("adding new product");
sprAdmin.product.viewModel.Products.push(new product());
var debugArray = sprAdmin.product.viewModel.Products(),
debugData = debugArray[debugArray.length - 1];
debug.debug("id: " + debugData.Id() + ", name: " + debugData.Name() + ", description: " + debugData.Description() + ", price: " + debugData.Price() + ", categoryId: " + debugData.CategoryId());
}
如您所见,debug.debug 检索 Products() 数组的最后一项并显示其内容,这也很有效。
但。
当我将多个项目添加到一个空数组并执行 var data = ko.mapping.toJSON(viewModel); debug.debug("ajax 提交数据:" + data);
它显示了转换为 JSON 的未映射 viewModel 的内容,如下所示:
{"Products":[{"Id":"1","CategoryId":"0","Name":"name","Description":"desc","Price":"0"},{}]}
Products 数组的第二项(如果存在,则更进一步)绝对为空。它始终仅适用于第一项。
请帮忙。
===
解决方案:
首先有必要声明一个 observableArray:
viewModel: {
Products: ko.observableArray([])
}
然后像这样映射:
sprAdmin.product.viewModel.Products(ko.mapping.fromJS(result.Products)());