Операции CRUD в сетке внутри шаблона детали родительской сетки

Вот пример кода из демонстрации шаблона Kendo Grid Detail Template на веб-сайте Telerik (I упростили шаблон детали, убрав вкладку-полоску):

@(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.EmployeeViewModel>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(e => e.FirstName).Width(120);
        columns.Bound(e => e.LastName).Width(120);
        columns.Bound(e => e.Country).Width(120);
        columns.Bound(e => e.City).Width(120);
        columns.Bound(e => e.Title);
    })
    .Sortable()
    .Pageable()
    .Scrollable()
    .ClientDetailTemplateId("template")
    .HtmlAttributes(new { style = "height:430px;" })
    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(5)
        .Read(read => read.Action("HierarchyBinding_Employees", "Grid"))
    )
    .Events(events => events.DataBound("dataBound"))
)

<script id="template" type="text/kendo-tmpl">
       @(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.OrderViewModel>()
            .Name("grid_#=EmployeeID#")
            .Columns(columns =>
            {
                columns.Bound(o => o.OrderID).Title("ID").Width(56);
                columns.Bound(o => o.ShipCountry).Width(110);
                columns.Bound(o => o.ShipAddress);
                columns.Bound(o => o.ShipName).Width(190);
            })
            .DataSource(dataSource => dataSource
                .Ajax()
                .PageSize(5)
                .Read(read => read.Action("HierarchyBinding_Orders", "Grid", new { employeeID = "#=EmployeeID#" }))
            )
            .Pageable()
            .Sortable()
            .ToClientTemplate()
        )
</script>

Я хочу добавить кнопку «Создать» в дочернюю сетку (сетку заказов) внутри шаблона. Проблема в том, что при добавлении нового Order мне нужно передать EmployeeID контроллеру, но следующее не работает, даже если оно работает для действия Read:

.Create(create => create.Action("AddOrder", "Grid", new { employeeID = "#=EmployeeID#" }))

Как передать EmployeeID контроллеру при добавлении нового элемента в сетку в шаблоне сведений?


person ataravati    schedule 25.05.2015    source источник


Ответы (1)


Вы не должны устанавливать значение EmployeeID в качестве параметра в своем транспорте создания. Поскольку здесь вы будете делать POST запрос, правильный способ сделать это - передать значение по умолчанию EmployeeID модели Grid.

Ваша внутренняя сетка должна иметь такой источник данных конфигурации

.DataSource(ds=> ds.Ajax()
                   .PageSize(5)
                   .Read(read => read.Action("HierarchyBinding_Orders", "Grid", new { employeeID = "#: EmployeeID #" }))
                   .Create(create => create.Action("AddOrder", "Grid"))
                   .Model(model => 
                          {
                              model.Id(f => f.OrderID)
                              model.Field(f => f.EmployeeID).DefaultValue("#: EmployeeID #")
                           })
            )

В тот момент, когда вы добавляете новую запись на сервер, ее значение EmployeeID установлено.

Примечание: EmployeeID будет назначен значением string, поскольку это выражение "#= #", у вас должен быть EmployeeID как string тип. Или вы получите ошибку бритвы для несовместимого типа.

person Dion Dirza    schedule 26.05.2015
comment
Я тоже пробовал. Не работает. Кстати, вызов действия Read также является запросом POST, но я передаю значение EmpolyeeID в качестве параметра; и это работает. - person ataravati; 26.05.2015
comment
Почему-то #=EmployeeID# не работает внутри DefaultValue("#=EmployeeID#"). - person ataravati; 26.05.2015
comment
С моей стороны это работает, вы читали ошибку? Его строковый тип, возможно, у вас несовместимый тип. Проверьте тип данных EmployeeID вашей модели, это int или строковый тип? - person Dion Dirza; 26.05.2015
comment
Если это не строковый тип, вам лучше изменить его на строковый тип - person Dion Dirza; 26.05.2015
comment
Я бы предпочел не менять тип данных. Однако, похоже, другого выхода нет. Метод DefaultValue должен был быть достаточно умным, чтобы преобразовать тип данных. - person ataravati; 26.05.2015
comment
потому что вы используете razor и комбинируете с оцененным javascript function expression, тогда как это приведет к строковому типу, несмотря ни на что. Можно изменить тип данных, если вы разделили модель, например модель просмотра и модель предметной области. - person Dion Dirza; 26.05.2015