2015-02-22 4 views
0

Я использую последнюю версию JTable от http://jtable.org/ (скачал ее вчера). Я настраиваю свой JTable, как показано ниже (я также включил серверный код ниже, который написан на C#). Функция List работает (данные отображаются в таблице), функция Add работает, и функция Delete работает. Однако, когда я перехожу к Редактировать строку, появляется ошибка при попытке заполнения данных для поля «ElevationsMulti». Я получаю сообщение об ошибке, которое просто говорит: «Невозможно загрузить параметры для поля ElevationsMulti».JavaScript JTable - значение NULL с несколькими каскадными списками/выпадающими списками

JTable Код:

$('#ReportsContainer').jtable({ 
     title: 'Reports', 
     actions: { 
      listAction: '/Report_SingleEstimate/GetReportNames?customerId=' + customerId, 
      createAction: '/Report_SingleEstimate/AddReport', 
      updateAction: '/Report_SingleEstimate/EditReport', 
      deleteAction: '/Report_SingleEstimate/DeleteReport' 
     }, 
     fields: { 
      ReportID: { 
       key: true, 
       list: false 
      }, 
      ReportName: { 
       title: 'Report Name' 
      }, 
      CustomerID: { 
       title: 'Customer', 
       list: false, 
       options: '/Estimates/GetCustomers', 
       defaultValue: customerId 
      }, 
      PlanNameID: { 
       title: 'Plan Name', 
       dependsOn: 'CustomerID', 
       options: function (data) { 
        if (data.source == 'list') { 
         return '/Estimates/GetListOfPlanNames?customerId=0'; 
        } 

        //data.source == 'edit' || data.source == 'create' 
        return '/Estimates/GetListOfPlanNames?customerId=' + data.dependedValues.CustomerID; 
       } 
      }, 
      ProductID: { 
       title: 'Product', 
       options: '/Estimates/GetProducts' 
      }, 
      HeaderFieldsMulti: { 
       title: 'Fields', 
       options: '/Report_SingleEstimate/GetHeaderFields', 
       type: 'multiselectddl', 
       list: false 
      }, 
      ElevationsMulti: { 
       title: 'Elevations', 
       type: 'multiselectddl', 
       dependsOn: ['PlanNameID', 'ProductID'], 
       options: function (data) { 
        if (data.source == 'list') { 
         return '/Elevation/GetAllElevations'; 
        } 

        return '/Report_SingleEstimate/GetElevations?PlanNameID=' + data.dependedValues.PlanNameID + 
          '&ProductID=' + data.dependedValues.ProductID; 
       }, 
       list: false 
      } 
     } 
    }); 

    $('#ReportsContainer').jtable('load'); 

Не уверен, если это делает разницу в JTable, но ElevationsMulti зависит от полого PlanNameID и ProductID, а поле PlanNameID зависит от полого CUSTOMERID. Другими словами, поле ElevationsMulti зависит от поля, которое зависит от другого поля (множественные вложенные выпадающие списки).

C# код на стороне сервера:

[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 }); 
     } 
    } 

Ошибка здесь:

Далее отладка дал мне более конкретную ошибку.

Параметры словарь содержит нулевую запись для параметра 'PlanNameID' не-обнуляемого типа 'System.Int32' для метода 'System.Web.Mvc.JsonResult GetElevations (Int32, Int32)' в «s84.Controllers. Report_SingleEstimateController. Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр.

В принципе, JTable отправляет PlanNameID на сервер в виде нулевого значения. Это, по-видимому, указывает на то, что JTable еще не загрузил параметры поля PlanNameID, когда он вызывает сервер для поля ElevationsMulti.

Как заставить JTable ждать загрузки поля ElevationsMulti до тех пор, пока не будет загружено поле PlanNameID?

ответ

0

Проблема решена.

Проблема возникла при использовании типа «multiselectddl» в JTable. Я изменил код в 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; 
    } 
Смежные вопросы