JavaScript JTable-具有多个级联列表/下拉列表的空值

JavaScript JTable-具有多个级联列表/下拉列表的空值,javascript,c#,jtable,Javascript,C#,Jtable,我正在使用昨天下载的最新版本的JTable。我设置了我的JTable,如下所示。我还包括了下面的服务器端代码,它是用C编写的。列表函数工作,数据显示在表中,添加函数工作,删除函数工作。但是,在编辑行时,尝试填充ElevationsMulti字段的数据时出错。我得到一个错误,简单地说,无法加载字段提升选项LTI JTable代码: 不确定它是否会对JTable产生影响,但ElevationsMulti取决于PlanNameID和ProductID字段,PlanNameID字段取决于Customer

我正在使用昨天下载的最新版本的JTable。我设置了我的JTable,如下所示。我还包括了下面的服务器端代码,它是用C编写的。列表函数工作,数据显示在表中,添加函数工作,删除函数工作。但是,在编辑行时,尝试填充ElevationsMulti字段的数据时出错。我得到一个错误,简单地说,无法加载字段提升选项LTI

JTable代码:

不确定它是否会对JTable产生影响,但ElevationsMulti取决于PlanNameID和ProductID字段,PlanNameID字段取决于CustomerID字段。换句话说,ElevationsMulti字段依赖于依赖于另一个字段多个嵌套下拉列表的字段

C服务器端代码:

此处出现错误:

进一步的调试给了我一个更具体的错误

参数字典包含“s84.Controllers.Report_SingleEstimateController”中方法“System.Web.Mvc.JsonResult GetElevationsInt32,Int32”的非null类型“System.Int32”的参数“PlanNameID”的null条目。可选参数必须是引用类型、可为null的类型或声明为可选参数

基本上,JTable将PlanNameID作为空值发送到服务器。这似乎表明JTable在服务器调用ElevationsMulti字段时尚未加载PlanNameID字段的选项

如何使JTable等待加载ElevationsMulti字段,直到加载PlanNameID字段之后?

问题已解决

问题来自于在JTable中使用multiselectddl类型。我将JTable中创建multiselectddl的代码更改为与常规下拉列表相同的代码。代码如下:

    _createInputForRecordField: function (funcParams) {
        ...

        //Create input according to field type
        if (field.type == 'date') {
            return this._createDateInputForField(field, fieldName, value);
        } else if (field.type == 'textarea') {
            return this._createTextAreaForField(field, fieldName, value);
        } else if (field.type == 'password') {
            return this._createPasswordInputForField(field, fieldName, value);
        } else if (field.type == 'checkbox') {
            return this._createCheckboxForField(field, fieldName, value);
        } else if (field.options) {
            if (field.type == 'multiselectddl') {
                return this._createDropDownListMultiForField(field, fieldName, value, record, formType, form);
            } else if (field.type == 'radiobutton') {
                return this._createRadioButtonListForField(field, fieldName, value, record, formType);
            } else {
                return this._createDropDownListForField(field, fieldName, value, record, formType, form);
            }
        } else {
            return this._createTextInputForField(field, fieldName, value);
        }
    },

    _createDropDownListMultiForField: function (field, fieldName, value, record, source, form) {
        //Create a container div
        var $containerDiv = $('<div class="jtable-input jtable-multi-dropdown-input"></div>');

        //Create multi-select element
        var $select = $('<select multiple="multiple" class="' + field.inputClass + '" id="Edit-' + fieldName + '" name=' + fieldName + '></select>')
            .appendTo($containerDiv);

        var options = this._getOptionsForField(fieldName, {
            record: record,
            source: source,
            form: form,
            dependedValues: this._createDependedValuesUsingForm(form, field.dependsOn)
        });

        this._fillDropDownListWithOptions($select, options, value);

        return $containerDiv;
    }
    [HttpPost]
    public JsonResult GetElevations(int PlanNameID, int ProductID)
    {
        try
        {
            int estimateId = Estimates.getEstimateId(PlanNameID, ProductID);
            List<MyDropdownList> elevations = Estimate_ElevationList.listElevationsByEstimateForDropdown(estimateId);

            return Json(new { Result = "OK", Options = elevations });
        }
        catch (Exception ex)
        {
            return Json(new { Result = "ERROR", Message = ex.Message });
        }
    }
    _createInputForRecordField: function (funcParams) {
        ...

        //Create input according to field type
        if (field.type == 'date') {
            return this._createDateInputForField(field, fieldName, value);
        } else if (field.type == 'textarea') {
            return this._createTextAreaForField(field, fieldName, value);
        } else if (field.type == 'password') {
            return this._createPasswordInputForField(field, fieldName, value);
        } else if (field.type == 'checkbox') {
            return this._createCheckboxForField(field, fieldName, value);
        } else if (field.options) {
            if (field.type == 'multiselectddl') {
                return this._createDropDownListMultiForField(field, fieldName, value, record, formType, form);
            } else if (field.type == 'radiobutton') {
                return this._createRadioButtonListForField(field, fieldName, value, record, formType);
            } else {
                return this._createDropDownListForField(field, fieldName, value, record, formType, form);
            }
        } else {
            return this._createTextInputForField(field, fieldName, value);
        }
    },

    _createDropDownListMultiForField: function (field, fieldName, value, record, source, form) {
        //Create a container div
        var $containerDiv = $('<div class="jtable-input jtable-multi-dropdown-input"></div>');

        //Create multi-select element
        var $select = $('<select multiple="multiple" class="' + field.inputClass + '" id="Edit-' + fieldName + '" name=' + fieldName + '></select>')
            .appendTo($containerDiv);

        var options = this._getOptionsForField(fieldName, {
            record: record,
            source: source,
            form: form,
            dependedValues: this._createDependedValuesUsingForm(form, field.dependsOn)
        });

        this._fillDropDownListWithOptions($select, options, value);

        return $containerDiv;
    }