2017-02-18 67 views
0

在C#中,我将API调用中的对象传递给UI,然后想要自动将该对象的属性映射到视图模型。我希望能够使用Knockout的映射插件来完成此操作。.Net类的挖空映射

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); 
    }); 

但是,映射似乎并不奏效。我没有得到一个错误,但模型似乎是一个空的函数。

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

+0

“数据”是什么样的?也许映射插件解析它有困难。 –

回答

0

系列化你的视图模型为JSON使用@Html.Raw(JsonConvert.SerializeObject(this.Model))

例如从这个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); 
}); 
0

我相信你将不得不从.fromJSON切换到.fromJS并使用淘汰赛的三个参数的方法映射api:

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