如何在kendo网格单元格中的kendo下拉列表中检索文本值,但仍然在CRUD中传递ID

时间:2015-10-20 21:44:46

标签: kendo-ui kendo-grid

我在寻找与剑道网格相关的解决方案时遇到了问题。

我正在Kendo Grid的单元格中渲染一个剑道下拉列表。它似乎看起来很好,直到用户关注或关闭单元格中的下拉列表。红色哈希显示已进行更改,但它显示了剑道DDL的数据值字段,而不是文本。好的,我知道我可以在dataTextField中使用DS中的相同字段,因为我在dataValueField中使用它,但这对我不起作用...因为当我调用create或update时,我需要能够将所选项目的主键或ID传回我的web api控制器。

这是网格DS

function loadContactGrid(vendorID) {

    var contactsReadURL = null;
    contactsReadURL = "/contacts/getcontacts/" + parseInt(vendorID);

    contactGridDS = new kendo.data.DataSource({
        transport: {
            read: {
                url: contactsReadURL,
                type: 'GET',
                contentType: "application/json; charset=utf-8",
            },
            update: {
                url: "/contacts/UpdateContacts/",
                type: 'PUT',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                error: function(xhRequest, ErrorText, thrownError) {
                    alert('ERROR!!!\n' + ' xhRequest: ' + xhRequest + '\n' + ' ErrorText: ' + ErrorText + '\n' + ' thrownError: ' + thrownError + '\n');
                },
                complete: function(e) {
                    $("#contactGrid").data("kendoGrid").dataSource.read();
                }
            },
            destroy: {
                url: "/contacts/DeleteContact/",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                type: "DELETE"
            },
            create: {
                url: "/contacts/InsertContact/",
                contentType: "application/json; charset=utf-8",
                type: 'POST',
                dataType: "json",
                success: function(results) {
                    alert('Contacts successfully saved!');
                },
                error: function(xhRequest, ErrorText, thrownError) {
                    alert('ERROR!!!\n' + ' xhRequest: ' + xhRequest + '\n' + ' ErrorText: ' + ErrorText + '\n' + ' thrownError: ' + thrownError + '\n');
                },
                complete: function(e) {
                    $("#contactGrid").data("kendoGrid").dataSource.read();
                }
            },
            parameterMap: function(options, operation) {
                if (operation !== "read" && options) {
                    return JSON.stringify(options.models);
                }
                if (operation == "create") {
                    // send the created data items as the "models" service parameter encoded in JSON
                    return { models: kendo.stringify(data.models) };
                }

            }
        },
        batch: true,
        scrollable: false,
        pageSize: 8,
        change: function(e) {
            if (e.action == "itemchange" && e.field == "email") {
                var model = e.items[0];
                if (isEmailValid($('input[name=email]').val()) == false) {
                    e.items[0].receivereport = false;
                }
            }

            if (e.action == "itemchange" && e.field == "contacttype") {
                var model = e.items[0];
                //setTimeout(function () {
                    //$('.k-dirty-cell').focusout(function() {
                        //alert($(this).text(textOverrideContactType(e.items[0].contacttype)));
                    //});
                    //textOverrideContactType(e.items[0].contacttype);

                //}, 1000); attempting to change text in cell here failed
            }

            if (e.action === "remove") {
                this.sync();
            }
        },
        schema: {
            model: {
                id: 'contactid',
                fields: {
                    roletyp_seq: { editable: false, nullable: false, required: true, type: 'string' },
                    contacttype: { editable: true, nullable: false, required: true, type: 'number' },
                    roletyp_pk: { editable: false, nullable: false, required: true, type: 'number' },
                    contactid: { editable: false, nullable: false, required: true, type: 'number' },
                    vendorid: { editable: false, nullable: false, required: true, type: 'number' },
                    prevrole_pk: {
                        editable: false,
                        nullable: true,
                        required: true,
                        type: "number",
                    }
                }
            }
        },
    });

我的网格

        $("#contactGrid").kendoGrid({
        dataSource: contactGridDS,
        navigatable: true,
        dataBound: mapContactTypes,
        editable: true,
        //editable: "inline",
        //editable: "popup",
        edit: function (input) {

            if ($('input[name=receivereport]').is(':focus')) {

                //detect if email is valid
                //get input immediately before this one
                if (isEmailValid($('input[name=receivereport]').parent().prev().text()) == false) {
                   // disable check box
                   // alert("invalid");
                    $('input[name=receivereport]').attr('disabled', 'true');
                    $('input[name=receivereport]').prop('checked', false);

                } else {
                   // enable check box
                   // alert("valid");
                    $('input[name=receivereport]').removeAttr('disabled');
                    $('input[name=receivereport]').prop('checked', false);
                }
            }

            //when user clicks into or out of a field, if the name in the respective row name is blank, alert the user
            var grid = this;
            var fieldName = grid.columns[input.container.index()].field;

            if (isNameInContactGridPopulated(fieldName) == false) {
                alert("You can't leave out a contact name in the row you are editing.");
                //disable save button
                $('.k-grid-save-changes').addClass('k-state-disabled');
                $('.k-grid-save-changes').hide();
            } else {
                //do nothing
                $('.k-grid-save-changes').removeClass('k-state-disabled');
                $('.k-grid-save-changes').show();
            }

            if ($('input[name=contactname]').is(":focus") == true) {
                //disable save button
                if ($('input[name=contactname]').val() == '') {
                    $('.k-grid-save-changes').addClass('k-state-disabled');
                    $('.k-grid-save-changes').hide();
                }

            }

            $('input[name=contactname]').keyup(function() {

                if ($(this).val() == '') {
                    $('.k-grid-save-changes').addClass('k-state-disabled');
                    $('.k-grid-save-changes').hide();
                }

            });


            $('input[name=contactname]').focusout(function () {

                if ($(this).val() != '') {
                    $('.k-grid-save-changes').removeClass('k-state-disabled');
                    $('.k-grid-save-changes').show();
                }

            });

        },
        toolbar: ["save", "cancel"],
        pageable: true,
        columns: [
            { field: 'roletyp_seq', title: 'RT Seq.', hidden: true, attributes: { 'class': 'contactCell_roletyp_seq' } },
            { field: 'contacttype', title: 'Contact Type', hidden: false, attributes: { 'class': 'contactCell_contacttype' }, editor: loadContactTypeEditor, width: "200px", template: "#=textOverrideContactType(1)#" },
            //{ field: 'contacttype', title: 'Contact Type', hidden: false, attributes: { 'class': 'contactCell_contacttype' }, editor: loadContactTypeEditor, width: "200px", template: "#=textOverrideContactType(contacttype)#" },
            //{ field: 'contacttype', title: 'Contact Type', hidden: false, attributes: { 'class': 'contactCell_contacttype' }, editor: loadContactTypeEditor, width: "200px" },
            { field: 'prevrole_pk', title: 'prev role ID', hidden: true, attributes: { 'class': 'contactCell_prevrole_pk' } },
            { field: 'roletyp_pk', title: 'Role Type ID', hidden: true, attributes: { 'class': 'contactCell_roletyp_pk' } },
            { field: 'contactid', title: 'Contact ID', hidden: true, attributes: { 'class': 'contactCell_contactid' } },
            { field: 'vendorid', title: 'Vendor ID', hidden: true, attributes: { "class": 'contactCell_vendorid' } },
            { field: 'contactname', title: 'Name', hidden: false, attributes: { "class": 'contactCell_contactname' } },
            { field: 'workphone', title: 'Phone', hidden: false, attributes: { "class": 'contactCell_phone' } },
            { field: 'mobilephone', title: 'Cell', hidden: false, attributes: { "class": 'contactCell_mobilephone' } },
            { field: 'title', title: 'Title', hidden: false, attributes: { "class": 'contactCell_title' } },
            { field: 'email', title: 'Email', hidden: false, attributes: { "class": 'contactCell_email' } },
            { field: 'receivereport', title: 'Receive Reports?', hidden: false, attributes: { "class": 'contactCell_receivereport' }, template: '<input type="checkbox" #= receivereport ? "checked=checked" : "" # value=""  disabled="disabled" ></input>' },

            { command: "destroy", title: "&nbsp;", width: "100px" }
        ],
        sortable: {
            mode: 'single',
            allowUnsort: false
        }
    });

然后,我有两个功能如下。 1是自定义编辑器,另一个是我考虑覆盖kendo ddl中显示的文本的尝试。

    function loadContactTypeEditor(container, options) {

    var contactTypeDS = new kendo.data.DataSource({
        dataType: "json",
        type: "GET",
        transport: {
            read: "/contacts/GetAllContactTypes/"
        }
    });
    contactTypeDS.read();

    $('<input class="contactTypeDropDown" required data-text-field="roletyp_dsc" data-value-field="roletyp_pk" data-bind="value:' + options.field + '"/>').appendTo(container).kendoDropDownList({
        dataTextField: "roletyp_dsc",
        dataValueField: "roletyp_pk",
        autoBind: false,
        select: function (e) {
            //if (e.sender.text() != '') {
            //        $('#contactGrid_active_cell').html(e.sender.text());

            //}
            //if (e.sender.text() != '') {
            //    setTimeout(function() {
            //        $('.contactCell_contacttype').text(e.sender.text());
            //    }, 1000);  
            //}

            //options.model[options.field] = e.sender.text();
        },
        //dataBound: function(){

        //    options.model[options.field] = e.sender.text();
        //},
        dataSource: contactTypeDS
    });
}

function textOverrideContactType(roleId) {
    //need to find a match on the passed in role/contact type ID and return it's match to "mask/overwrite" the text that's there after a user selects an item in the dropdown
    $.ajax({
        dataType: 'json',
        type: 'GET',
        url: "/contacts/GetAllContactTypes/",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            $.each(data, function (key, val) {
                if (roleId == key) {
                    return val;
                }
            });
        },
        failure: function (error) {
            alert("Error loading contact types.");
        }
    });
}

总结一下:我尝试了一些无用的东西。发生的事情是,DDL呈现得很好,即使用户没有离开该DDL,也会显示正确的“标签”,但是当该控件失去焦点时,它会显示数据值字段。我不能,我需要能够显示数据文本字段。这就是我编写textoverride方法的原因。但我试图在网格,字段的模板中调用它:它不起作用。它说它不承认这个功能。我不明白;它已经明确宣布了。我应该传递什么作为参数,它不像这里的演示...有点不同,因为我用另一个远程数据源填充DDL。

http://demos.telerik.com/kendo-ui/grid/editing-custom

这是另一件事;我需要将数据值字段ID保留并在调用时传递到我的web api控制器中。现在,就目前而言,我只能在控制器中显示“文本”,而不是“ID”。在read方法中,我无法使用该ID。 CRUD正在击中的存储过程完全不同。我的插入和更新存储过程需要将该contacttype ID作为数字。

提前致谢。我确定我很接近......

2 个答案:

答案 0 :(得分:1)

从提供的信息中,您似乎需要通过设置列的“值”选项来创建ForegnKey列。请查看以下示例:

答案 1 :(得分:1)

我实际上最终使用其他方法来做到这一点。以上对我来说似乎仍然是虚幻的。我最终更改了另一行中已经可用的键的值,以便传回控制器。我试过提供的答案无济于事。遗憾!