1

我有一个像这样的简单 MVC 模型:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MobileNumber { get; set; }
    public string EmailAddress { get; set; }
}

我想在淘汰视图模型中映射一个这种类型的对象以填充它:

var UserViewModel = function () {
    var self = this;
    self.user = ko.mapping.fromJS({});
    $.getJSON("/UserManagement/CreateEmptyUser", function (data) {
        ko.mapping.fromJS(data, self.user);
    });
    self.createUser = function (data, eventArgs) {
        var user = data;
        $.ajax({
            type: "post",
            contentType: "application/json",
            data: ko.toJSON(user),
            url: "@Url.Action("CreateUser")",
            success: function () {
                window.location = "@Url.Action("AddNew")";
            }
        });
    };
};

我遇到的问题是我不知道如何映射任何单个对象。我试过使用

self.user = ko.mapping.fromJS([]);
$.getJSON("/UserManagement/CreateEmptyUser", function (data) {
        ko.mapping.fromJS(data,{}, self.user);
    });

它被用于数组并试图提取索引 0 处的元素,我认为另一个可行的解决方案是第二个注释块中的那个。我在谷歌上找到的所有东西都让我映射了整个数组,但对简单的对象映射却没有。有没有合适的方法来做到这一点?我想保持模型分离,而不是在javascript中手动描述它的属性。

谢谢,亚历克斯巴拉克

4

3 回答 3

3

我认为您的问题是您正在使用映射 from 方法来实例化您的视图模型,这不会给它任何属性,因此当您尝试在 JSON 调用后映射数据时,self.user 上没有要填充的属性。使用您想要的属性创建您的用户对象,或者首先使用 mapping.fromJS 创建您的视图模型:

self.user = { FirstName: ko.observable(''), etc... }

并保持您的映射线不变,或者

self.user;
$.getJSON("/UserManagement/CreateEmptyUser", function (data) {
    self.user = ko.mapping.fromJS(data);
}
于 2013-07-15T12:51:51.080 回答
0

我一直在工作并检查这一点,并在一开始就找到了我想要的解决方案。这个想法是使用@Paul Manzotti 的建议,

self.user;
$.getJSON("/UserManagement/CreateEmptyUser", function (data) {
    self.user = ko.mapping.fromJS(data);
}

但是用self.user;self.user={};替换

self.user = ko.mapping.fromJS(data)

ko.mapping.fromJS(data,{},self.user);

如果使用它,则无需在视图模型中手动声明每个对象的属性。希望这对那些偶然发现相同问题的人有用。

于 2013-07-17T14:04:40.510 回答
0

如果您的 viewModel 本身需要是一个可观察的,那么我发现使用映射返回一个可观察的数组作为 OP 提到的,然后返回该数组中的第一个项目。这对于在 ajax 中返回一个对象也很有用,然后您希望将其推送到现有的 observableArray 上。我有一个帮助函数:

koMappingUsingArray = function (jsObject, mapping) {
    var observableObjectArray = ko.observableArray();
    var objectArray = new Array(jsObject);
    ko.mapping.fromJS(objectArray, mapping, observableObjectArray);

    return observableObjectArray()[0];
};

然后将其称为:

    self.myObject = ko.observable();

    $.ajax({
        type: "POST",
        url: "....",
        data: ko.mapping.toJSON(???),
        contentType: "application/json; charset=utf-8",
        success: function (returnedObject) {
            self.myObject (koMappingUsingArray(returnedObject));
        });
于 2015-08-28T08:31:07.403 回答