Asp.net mvc 敲除映射可观测阵列MVC

Asp.net mvc 敲除映射可观测阵列MVC,asp.net-mvc,knockout.js,knockout-mapping-plugin,Asp.net Mvc,Knockout.js,Knockout Mapping Plugin,嗨,我在网上找了几个小时试图解决这个问题,但我找不到解决办法 我正在使用ASP.NET MVC和Knockout构建解决方案。控制器返回供用户选择的选项到视图,该视图将其转换为JSON,并使用映射插件将其映射到淘汰视图模型。它会正确填充,因为当我这样做:ko.toJSON$data来测试它时,会返回正确的数据,但是当向列表中添加项目时,视图不会更新列表 我的猜测是,这些属性是不可观测的,但我不确定如何解决这个问题 这是返回的JSON的一个示例: [{Key:1,Value:company}] 这

嗨,我在网上找了几个小时试图解决这个问题,但我找不到解决办法

我正在使用ASP.NET MVC和Knockout构建解决方案。控制器返回供用户选择的选项到视图,该视图将其转换为JSON,并使用映射插件将其映射到淘汰视图模型。它会正确填充,因为当我这样做:ko.toJSON$data来测试它时,会返回正确的数据,但是当向列表中添加项目时,视图不会更新列表

我的猜测是,这些属性是不可观测的,但我不确定如何解决这个问题

这是返回的JSON的一个示例:

[{Key:1,Value:company}]

这是我的javascript:

function ProjectWorkedOn() {
    var self = this;
    self.client = ko.observable();
    self.job = ko.observable();
    self.project = ko.observable();
    self.workType = ko.observable();
}

function createTimesheetViewModel() {
    var self = this;

    //list of options
    self.UserClients = ko.observableArray();
    self.UserProjects = ko.observableArray();
    self.UserJobs = ko.observableArray();
    self.UserWorkTypes = ko.observableArray();

    //keep track of selected options
    self.selectedClient = ko.observable();
    self.selectedProject = ko.observable();
    self.selectedJob = ko.observable();
    self.selectedWorkType = ko.observable();

    //list to add choices in
    self.ListProjectsWorkedOn = ko.observableArray();


    self.addProjectWorkedOn = function () {
        var project = new ProjectWorkedOn();
        project.client = self.selectedClient;
        project.job = self.selectedJob;
        project.project = self.selectedProject;
        project.workType = self.selectedWorkType;
        self.ListProjectsWorkedOn.push(project)
    }
    self.removeProjectWorkedOn = function (projectWorkedOn) {
        self.ListProjectsWorkedOn.remove(projectWorkedOn)
    }

}



$(function () {
    var CreateTimesheetViewModel = new createTimesheetViewModel();

    CreateTimesheetViewModel.UserClients = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserClients))');
    CreateTimesheetViewModel.UserProjects = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserProjects))');
    CreateTimesheetViewModel.UserJobs = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserJobs))');
    CreateTimesheetViewModel.UserWorkTypes = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserWorkTypes))');

    ko.applyBindings(CreateTimesheetViewModel, document.getElementById("CreateTimesheet"));
});
这是视图中向列表中添加项目的部分:

<table>
    <tr>
        <td>
            Projects Worked On:
        </td>
        <td>
            Client: <select data-bind="options: UserClients, optionsText: 'Value', value: selectedClient"></select>
        </td>
        <td>
            Project: <select data-bind="options: UserProjects, optionsText: 'Value', value: selectedProject"></select>
        </td>
        <td>
            Job: <select data-bind="options: UserJobs, optionsText: 'Value', value: selectedJob"></select>
        </td>
        <td>
            Service: <select data-bind="options: UserWorkTypes, optionsText: 'Value', value: selectedWorkType"></select>
        </td>
        <td>
            <button data-bind="click: addProjectWorkedOn">Add Project</button>
        </td>
    </tr>
</table>
这就是显示它们的内容:

<table>
    <tr>
        <td>Client</td>
        <td>Project</td>
        <td>Job</td>
        <td>Service</td>
        <td></td>
    </tr>
    <tbody data-bind="foreach: ListProjectsWorkedOn()">
        <tr>
            <td data-bind="text: client.Value"></td>
            <td data-bind="text: project.Value"></td>
            <td data-bind="text: job.Value"></td>
            <td data-bind="text: workType.Value"></td>
            <td><button data-bind="click: $parent.removeProjectWorkedOn">Remove</button></td>
        </tr>
    </tbody>
</table>
提前谢谢

编辑:

我算出来了

要添加项目,请设置如下属性:project.clientValueself.selectedClient.Value

然后,要在视图中引用它们,请将其作为函数调用:clientValue


Chris Patt解释说,当您想要获取其值时,应将可观测值作为函数调用,这是值得赞扬的,因为您正在将项目工作设置为可观测值,并且获取的选定值不正确。要设置一个可观察的对象,您可以像传递函数一样将值作为参数传递,要获得可观察对象的值,您可以像调用函数一样调用它。它们实际上是函数

self.addProjectWorkedOn = function () {
    var project = new ProjectWorkedOn();
    project.client(self.selectedClient());
    project.job(self.selectedJob());
    project.project(self.selectedProject());
    project.workType(self.selectedWorkType());
    self.ListProjectsWorkedOn.push(project)
}
编辑


我认为您实际上想要的是选定的值,而不是实际的整个JSON对象。你所尝试的是不可能的。select的值必须是整数或字符串-不能是完整对象。通常,您会首先简单地返回一个值/文本列表来填充选择,其中的值类似于id。然后,在选择后,您会发出一个AJAX请求来检索具有该id的对象。

谢谢,我尝试了,但它仍然没有显示值。列表正在显示,并且它的大小正在增加,但它绑定到的每个值都是空的。奇怪的是,我可以添加和删除数据,但它不会显示数据。我只是将其更改为键值对,但无论哪种方式,它似乎都应该工作,因为在添加新项时正在填充列表。唯一的问题是它无法更新绑定到它的视图的部分。您向observableArray添加了新的ProjectWork,但没有任何有意义的数据进入对象。