Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Knockoutjs使用MVC从服务器填充数据_Javascript_C#_Json_Asp.net Mvc_Knockout.js - Fatal编程技术网

Javascript Knockoutjs使用MVC从服务器填充数据

Javascript Knockoutjs使用MVC从服务器填充数据,javascript,c#,json,asp.net-mvc,knockout.js,Javascript,C#,Json,Asp.net Mvc,Knockout.js,我试图用服务器上的一些初始值填充knockoutjs viewmodel,我使用ASP.Net MVC,因此我的做法是将MVC viewmodel传递给视图: public ActionResult Edit(int cvId) { CV cv = repository.FindCV(cvId); //auto mapper mapping Mapper.CreateMap<CV, MyCVViewModel>(); Mapper.CreateMap

我试图用服务器上的一些初始值填充knockoutjs viewmodel,我使用ASP.Net MVC,因此我的做法是将MVC viewmodel传递给视图:

public ActionResult Edit(int cvId)
{
    CV cv = repository.FindCV(cvId);

    //auto mapper mapping
    Mapper.CreateMap<CV, MyCVViewModel>();
    Mapper.CreateMap<Company, MyCompanyViewModel>();
    Mapper.CreateMap<Education, MyEducationViewModel>();
    Mapper.CreateMap<Reference, MyReferenceViewModel>();
    var model = Mapper.Map<CV, MyCVViewModel>(cv);

    return View(model);
}
在此阶段,将填充所有内容:

生成的json字符串是:

问题:

1。问题是,当我更改某些值时,它们不会绑定,只有标题和语句更改:

正如您所见,生成的json只会更改标题和语句,公司内部的值不会更改

2。再次保存此数据时,如何让服务器端知道哪些内容已被编辑,哪些内容已被删除,如何使用MVC和entity framework跟踪这些内容,并相应地更改数据库

更新

我的淘汰版javascript,我已经定义了这些可观察对象,如何在ObservalArray中定义它们

function Company() {
    this.companyName = ko.observable();
    this.jobTitle = ko.observable();
    this.description = ko.observable();
    this.startDate = ko.observable();
    this.endDate = ko.observable();
}

问题是您正在尝试更新ObservalArray中的项。ObservableArray所做的一切就是为您维护阵列模型,这意味着如果您在您的公司中添加或删除一些可观察的内容,它将反映在阵列中。 为了对数组项进行更改,需要将ObservalArray中的每个项设置为可观察

请看下面的帖子:
关于你的第一个问题:

问题是您需要为每个数组项使用
ko.observable

例如:

现在,当您将公司可观察对象绑定到UI时,viewmodel上的每个数组元素都将保持同步


关于你的第二个问题,我建议你使用一个类似ORM的工具来跟踪变化。Breeze.js有一个使用knockout.js的函数。

效果很好,只有一个问题:if语句和or语句的用途是什么。if语句允许将
Company
作为函数调用,并使用
new
构造。
|
表达式设置一个默认值,以防json缺少元素。
var CVViewModel = function (data) {
    var self = this;

    //list view model
    self.title = ko.observable(data.title);
    self.statement = ko.observable(data.statement);
    self.reference = ko.observable(data.reference);
    self.companies = ko.observableArray(data.companies);
    self.educations = ko.observableArray(data.educations);
    self.references = ko.observableArray(data.references);
}
function Company() {
    this.companyName = ko.observable();
    this.jobTitle = ko.observable();
    this.description = ko.observable();
    this.startDate = ko.observable();
    this.endDate = ko.observable();
}
function CVViewModel(data) {
    var self = this;

    //list view model
    self.title = ko.observable(data.title);
    self.companies = ko.observableArray(data.companies.map(Company));
}

function Company(data) {
    if (!(this instanceof Company)){
        return new Company(data);
    }
    this.companyName = ko.observable(data.companyName || '');
    this.jobTitle = ko.observable(data.jobTitle || '');
    this.description = ko.observable(data.description || '');
    this.startDate = ko.observable(new Date(data.startDate) || '');
    this.endDate = ko.observable(new Date(data.endDate) || '');
}