1

我正在传递以下 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)());
4

0 回答 0