来自.Net类的Knockout映射

时间:2017-02-18 04:36:09

标签: javascript c# asp.net-web-api knockout.js

在C#中,我将API调用中的对象传递给UI,然后希望自动将该对象的属性映射到视图模型。我希望使用Knockout的映射插件来做到这一点。

 public class MyModel
    {
        public int ID { get; set; }

        [Display(Name ="Debt Name")]
        [Required(ErrorMessage = "A description is required")]
        public string Description { get; set; }

    }

这是我从API调用(WebAPI)传递给UI的模型的简化版本。

在Javascript中,我定义了一个我想要填充的类:

class Model {
    id: KnockoutObservable<number>;
    description: KnockoutObservable<string>;
}

在我的ViewModel之外。

在我的视图模型中,我创建了模型对象,并在我的构造函数中尝试使用映射填充类。你可以看到我注释掉的手册版本,但是我试图摆脱它:

class DebtViewModel {

    model: Model = new Model();

    constructor() {

        //this.model.id = ko.observable(0);
        //this.model.description = ko.observable("");

        $.get("/api/debt/1")
            .done((data) => {

                this.model = ko.mapping.fromJSON(data);

                //this.model.id(data.ID);
                //this.model.description(data.Description);
    }); 

但是,映射似乎不起作用。我没有收到错误,但模型似乎只是一个空函数。

可以这样做吗?我做错了什么?

2 个答案:

答案 0 :(得分:0)

使用@Html.Raw(JsonConvert.SerializeObject(this.Model))

将您的视图模型序列化为JSON

例如来自此answer

$(function () {
    var jsonModel = '@Html.Raw(JsonConvert.SerializeObject(this.Model))';
    var mvcModel = ko.mapping.fromJSON(jsonModel);

    var myViewModel = new viewModel();
    var g = ko.mapping.fromJS(myViewModel, mvcModel);

    ko.applyBindings(g);
});

答案 1 :(得分:0)

我相信您必须从.fromJSON切换到.fromJS并使用knockout mapping api的三参数方法:

ko.mapping.fromJS(data, {}, this.model);