如何根据映射到字段的viewmodel自动将json对象映射到字段?

时间:2014-02-11 20:31:14

标签: ajax json asp.net-mvc-4 razor-2

我有一个最初加载了空白视图模型的视图。我想用一个json对象(获得的视图ajax post)填充已经渲染的视图,该对象基于该视图的viewmodel。

有没有办法自动执行此操作?
有没有办法反向做? (匹配viewmodel json对象的字段)

2 个答案:

答案 0 :(得分:0)

我知道从ajax调用返回数据并将其放入字段的唯一方法是手动

$('#TextField1').val(result.TextField1);
etc..

将其发送回您可以执行的控制器

data: $('form').serialize(),

这将获取该表单中的所有字段并将它们发送回控制器

答案 1 :(得分:0)

好吧,看起来这符合我的需求。 我需要遵循一个约定容器的约定,该容器的名称与它们各自的属性相同,并且在它们上面放一个类来表示它们包含子字段。

function MapJsonObjectToForm(obj, $container) {
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            var $field = $container.find('#' + key);
            if ($field.is('div')) {
                MapJsonObjectToForm(obj[key], $field);
            } else {
                if (obj[key] == null) {
                    if ($field.hasClass('select2-offscreen')) {
                        $field.select2('val', '');
                        $field.select2().trigger('change');
                    } else {
                        $field.val("");
                    }
                } else {
                    if ($field.hasClass('select2-offscreen')) {
                        $field.select2('val', obj[key]);
                        $field.select2().trigger('change');
                    } else {
                        $field.val(obj[key]);
                    }
                }
            }
        }
    }
}

function MapFormToJsonObject(containerid) {
    var obj = {};
    $('.dataitem').each(function () {
        var exclude = "s2id";
        if ($(this).attr("ID").substring(0, exclude.length) !== exclude) {
            var parents = $(this).parents(".has-sub-fields");
            if (parents.length > 0) {
                obj = FindParents(obj, parents.get(), $(this).attr("ID"), $(this).val());
            } else {
                obj[$(this).attr("ID")] = $(this).val();
            }
        }
    });
    return obj;
}

function FindParents(obj, arr, id, value) {
    if (arr.length == 0) {
        obj[id] = value;
        return obj;
    }
    var parentID = $(arr[arr.length - 1]).attr("ID");
    arr.pop();
    if (obj[parentID] == null) {
        obj[parentID] = {};
    }
    obj[parentID] = FindParents(obj[parentID], arr, id, value);
    return obj;
}