我在 knockout 模板中有一个隐藏字段,其值会使用jquery更新。问题是,当尝试使用ajax将此值传递给服务器时,我在 Controller 中得到了空值。但是html源代码显示隐藏字段的值已更新。如果我用文本框替换了隐藏字段,则只有当我手动输入文本时,它才能正常工作。

jQuery的

        function getFileDetail(fileID, fileName) {
        $('#hdnFileName' + fileID).val(fileName);
        $('#lblFileName' + fileID).text(fileName);
    }

这是html基因 knockout 模板:
    <script type="text/html" id="fileTemplate">
        <div data-role="fieldcontain">
            <a href="#" data-bind="click: function () { openFileUpload('file', ID) }"><label data-bind="text: 'File Upload ' + ID, attr: { id: 'lblFileName' + ID }"></label></a><input type="button" value="Remove" data-bind="click: removeFile" />
        </div>
        <input type="hidden" name="hdnFileName" data-bind="attr: { id: 'hdnFileName' + ID, value: fileName }" />
    </script>

View 模型
function FileViewModel() {
        var self = this;
        self.ID = ko.observable();
        self.fileName = ko.observable();
        self.removeFile = function (file) { };
        self.Files = ko.observableArray([{ ID: 1, fileName: "", removeFile: function (file) { self.Files.remove(file); }}]);

        self.addNewFile = function () {
            var newFile = new FileViewModel();
            newFile.ID = self.Files().length + 1;
            newFile.fileName = "";
            newFile.removeFile = function (file) { self.Files.remove(file); };
            self.Files.push(newFile);
            //$("input[name='hdnFileName'").trigger("change");
        }
    }
function ViewModel() {
        var self = this;
        self.fileViewModel = new FileViewModel();
        self.submitForm = function () {

            $.ajax({
                type: "POST",
                url: "<%= Url.Action("MeetingPresenter")%>",
                data: "{Files:" + ko.utils.stringifyJson(self.fileViewModel.Files) + "}",
                contentType: "application/json",
                success: function (data) {},
            });
        };
    }

最佳答案

如果您使用的是knockout.js,则无需修改DOM,只需更新ViewModel,DOM就会根据

function getFileDetail(fileID, fileName) {
    viewModel.fileViewModel.update(fileID, fileName);
}

update中添加FileViewModel函数
function FileViewModel() {
    // rest of the code

    self.update = function(fileID, fileName) {
        var file = ko.utils.arrayFirst(self.Files(), function(file) {
            return file.ID == fileID;
        });

        file.fileName(fileName); // this will change and the UI will be updated according
    };
}

注意:请注意,您在Files中有一个默认项目,该属性不会用update函数更改,因为属性不是observable
self.Files = ko.observableArray([{ ID: 1, fileName: "", removeFile: function (file) { self.Files.remove(file); }}]);

您可以通过将它们设置为observable(即ID: observable(1))来解决此问题,也可以创建一个new FileViewModel()

注意: viewModel必须在函数(即全局实例)中可访问,否则将是undefined

关于ajax - Knockout.js数据绑定(bind)隐藏字段值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30538632/

10-12 00:09