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