Не удается заставить динамический выпадающий список работать в строке сетки Kendo

#drop-down-menu #kendo-grid #kendo-asp.net-mvc

#выпадающее меню #kendo-grid #kendo-asp.net-mvc

Вопрос:

Я пытаюсь ограничить выпадающие списки в моей сетке kendo, чтобы они содержали только продукты, которые ранее были сопоставлены с компанией, выбранной в другой ячейке в строке.

Я использовал динамический выпадающий редактор шаблонов.

Однако идентификатор, передаваемый в getCompanyId(), всегда равен нулю, и поэтому мои выпадающие списки всегда равны нулю.

Вид:

 @(Html.Kendo().Grid<XXXAppXXX.Models.WeeklyRailPlan>()
      .Name("grid")
      .Columns(columns =>
      {
          columns.Bound(c => c.WeekNumber);
          columns.Bound(c => c.Company).ClientTemplate("#=(data.Company) ? Company.Name : 'Select Company...'#");
          columns.Bound(c => c.ServiceCode);
          columns.Bound(o => o.Product)
            .ClientTemplate("#= (data.Product) ? Product.Name : 'Select Product'#")
            .EditorTemplateName("DynamicDropDownList");
   //etc
      })
      .ToolBar(toolbar => {
          toolbar.Create();
          toolbar.Save();
      })
      .Editable(editable => editable.Mode(GridEditMode.InCell))
      .Pageable()
      .Filterable()
      .Events(ev => ev
             .Remove(@"function(e){setTimeout(function(){$('#grid').data('kendoGrid').dataSource.sync()})}")
                            )
      .Sortable(sortable => {
          sortable.SortMode(GridSortMode.SingleColumn);
      })

      .Filterable()
      .DataSource(dataSource => dataSource
          .Ajax()
          .Events(events => events.Error("error_handler"))
          .Sort(p => { p.Add("WeekNumber").Descending(); })
          .Model(model => model.Id(p => p.ID))
          .Read(read => read.Action("WeeklyRailPlans_Read", "WeeklyRailPlanGrid"))
          .Create(create => create.Action("WeeklyRailPlans_Create", "WeeklyRailPlanGrid"))
          .Update(update => update.Action("WeeklyRailPlans_Update", "WeeklyRailPlanGrid"))
          .Destroy(destroy => destroy.Action("WeeklyRailPlans_Destroy", "WeeklyRailPlanGrid"))
      )
)
  

Шаблон редактирования называется DynamicDropDownList.cshtml

 <script type="text/javascript">
    function getCompanyId() {
        return { CompanyID: '#=ID#' };
    }
</script>


@(Html.Kendo().DropDownList()
                .Name("Product")
                .DataValueField("ID")
                .DataTextField("Name")
                .DataSource(ds => ds
                    .Read(read => read.Action("GetProductsForCompany", "Products").Data("getCompanyId")))
)    
  

Метод контроллера GetProductsForCompany (всегда получает значение null)

         public ActionResult GetProductsForCompany(int CompanyID)
        {
            return Json(db.Products.Where(e => e.Companies.Any(t =>t.ID == CompanyID)), JsonRequestBehavior.AllowGet);
        }
  

Ответ №1:

Я использую такой код:

 <script type="text/javascript">
    function getCompanyId() {
        var gview = $('#grid').data("kendoGrid");
        var selectedItem = gview.dataItem(gview.select());
        return { CompanyID: selectedItem.ID };
    }
</script>
  

Комментарии:

1. Спасибо, но я все еще получаю: «Неперехваченная ошибка типа: не удается прочитать свойство ‘Company’ с нулевым значением в Object.getCompanyId [как данные]»

2. Рад, что это привело к вашему решению.

Ответ №2:

Это требуемое решение было:

 function getCompanyId() {
    var grid = $('#grid').data('kendoGrid');
    var dataItem = grid.dataItem(grid.table.find('.k-edit-cell').parents('tr'))
    return { CompanyID: dataItem.Company.ID };
}