0

これがノックアウトの問題なのか、JSON の問題なのか、それとも他の問題なのかはわかりませんので、すべて説明します。

多数のユーザーを表示する Web グリッドがあります。これらのメンバーは、AJAX ポップアップ ウィンドウを使用して編集できます。このウィンドウの一部として、特定のユーザーに役割を割り当てることができます。次の図に示すように:

これらのロールはドロップダウン メニューから選択されます。ユーザーに複数のロールを適用する場合は、ドロップダウンを追加できます。これは、ノックアウトの foreach バインディングを使用して行います。

保存をクリックすると、すべてのブラウザーで webgrid 列が自動的に更新されます。ただし、ユーザーを編集して追加の役割を与えた場合、[保存] をクリックしてからもう一度編集してみて、新しく追加した役割が IE に表示されません。ただし、Chrome と Firefox は完全に機能します。

このポップアップ ウィンドウの [保存] ボタンをクリックすると、次のコードを使用してデータが JSON としてサーバーに送信されます。

 $.ajax({
                    type: 'POST',
                    dataType: 'json',
                    url: '/Person/Save',
                    dataType: 'html',
                    data: JSON.stringify(jsonObj),
                    contentType: 'application/json; charset=utf-8',
                    success: function(data) {
                        dlg.dialog("close");
                        $('#myUserGrid').html(data);
                    },
                    error: function(data) {
                        console.debug(data);
                    }
                }); 

ポップアップ ウィンドウ ビューからの関連する html およびノックアウト コードは次のとおりです。

<tr>
        <td class="roleList" colspan="2">
            <table data-bind="foreach: RoleDdList">
                <tr>
                    <td class="label">
                        * Role:
                    </td>
                    <td>
                        <select data-bind="options: $root.Roles, value: $data.role, optionsValue:'Id', optionsText:'Name'"> <!--,optionsCaption: 'No Role' -->
                        </select>
                    </td>
                    </tr>
                <tr>
                    <td></td>
                    <td><a href="#" data-bind="click: $root.deleteRole, visible: $index()!=0">Delete Role</a></td>
                </tr>
            </table>
        </td>
        <tr></tr>

ViewModel には多くのコードがありますが、関連する部分は次のとおりです。

 var Role = function(roleId, roleName) {
    this.Id = roleId;
    this.Name = roleName;
};

// Class to represent a row in the Roles DropDown List
function RoleDropDown(initialRole) {
    var self = this;
    self.role = ko.observable(initialRole);
    }

$(function () {

    function myViewModel() {
        var self = this;

//code relating to other fields

// Role Code
        self.Roles = new ko.observableArray();
        @{
            foreach (var pair in Model.RolesList)
            {
                @:self.Roles.push(new Role(@pair.Key,"@pair.Value"));
            }
        }


        // List of Role DropDowns
        self.RoleDdList = ko.observableArray([
                new RoleDropDown(self.Roles()[0])
            ]);


        // Add a Role (code for link on form)
        self.addRole = function() {
            self.RoleDdList.push(new RoleDropDown(self.Roles()[0]));
        };

        // Delete a Role
        self.deleteRole = function(num) {
            self.RoleDdList.remove(num);
        };

        //
        @{
            if(@Model.Roles!=null)
            {

                @:self.RoleDdList.pop();

                foreach (var selectedRole in Model.RoleNumbers)
                {
                    @:self.RoleDdList.push(new RoleDropDown(@selectedRole));
                }
            }
        }



    }

    vm = new myViewModel();
    ko.applyBindings(vm);
    $.validator.unobtrusive.parse('#formUser');


});

この問題の根源について何か考えはありますか?

4

0 に答える 0