Отправить дополнительный параметр в задании сетки Кендо

У меня есть кендо Сетка следующим образом.

@(Html.Kendo().Grid<RevenueModel>()
     .Name("WeeklyRevenue")
     .Resizable(resizing => resizing.Columns(true))
     .Columns(columns =>
         {
            columns.Bound(p => p.Number).Width(100);
            columns.Bound(p => p.Type).Width(100);
            columns.Bound(p => p.Week1).Format("{0:c}");
            columns.Bound(p => p.Week2).Format("{0:c}");
            columns.Bound(p => p.Week3).Format("{0:c}");
            columns.Bound(p => p.Week4).Format("{0:c}");
            columns.Bound(p => p.Week5).Format("{0:c}");
            columns.Bound(p => p.TotalRevenue).Format("{0:c}");
         })
     .Scrollable()
     .Events(events => events.Change("onChange").DataBound("onDataBound"))
     .DataSource(dataSource => dataSource.Ajax().Read(read => read.Action("WeeklyRevenue", "Home")).ServerOperation(false))
     .Pageable(pager => pager.Refresh(true))
 )

Вот мой код контроллера

public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request)
        {
            ...
            DataSourceResult result = res.ToDataSourceResult(request);
            return Json(result, JsonRequestBehavior.AllowGet);
        }

Он отлично работает. Но я хочу отправить дополнительные данные, когда Grid считывает данные, что-то вроде следующего;

public ActionResult WeeklyRevenue([DataSourceRequest]DataSourceRequest request, string AdditionalParam)

Я не мог найти решение, как это сделать. Спасибо заранее.

Ответ 1

Если дополнительные данные известны на стороне сервера, вы должны использовать перегрузку метода Action, который принимает значения маршрута:

.DataSource(dataSource => dataSource.Server()
   .Read(read => read.Action("Read", "Home", 
        new { AdditionalParam = ViewData["AdditionalParam"] }))
)

Если эти дополнительные данные известны только на стороне клиента, вы должны использовать метод Data:

.DataSource(dataSource => dataSource.Ajax()
   .Read(read => read
      .Action("Read", "Home")
      .Data("additionalData")
  )
)
<script>
 function additionalData() {
     return {
         AdditionalParam: $("#search").val()
     };
 }
</script>

Ответ 2

Вы можете попробовать это:

.Read(read => read.Action("WeeklyRevenue", "Home", new { AdditionalParam = "Test" }))

Или через функцию JavaScript;

.Read(read => read.Action("Products_Read", "Grid").Data("additionalInfo"))

function additionalInfo() {
    return {
        AdditionalParam : "test"
    }
}

Или полный JavaScript;

transport: {
    read: {
      url: "/Home/WeeklyRevenue",
      type: "POST",
      contentType: "application/json",
      dataType: "json",
      data: {
        AdditionalParam : "Test" 
      }
    }
  }

Если вы используете параметрMap, убедитесь, что вы выполните следующие строки:

parameterMap: function (data, operation) {
                    if (operation != "read") {
                        return kendo.stringify(data.models);
                    }
                    else if (operation === "read") {
                        return kendo.stringify(data);
                    }
                }

В контроллере что-то вроде этого

public ActionResult Products_Read([DataSourceRequest] DataSourceRequest request, string AdditionalParam) {...}

Дополнительную документацию можно найти в здесь и здесь.

Ответ 3

Мы можем использовать приведенные ниже параметры для передачи дополнительных параметров.

//object route values
Read(read => read.Action("vs_Read", "vs", new{id=33})

//js function name
Read(read => read.Action("vs_Read", "vs").Data("passAdParam")

//By Template Delegate
Read(read => read.Action("Aggregates_Read", "Grid").Data(@<text>
            function() {
                //pass parameters to the Read method
                return {
                    name: "test",
                    id: $("#search").val()
                }
            }
              </text>))

Ответ 4

В моем случае: у меня есть текст типа ввода, и я хочу, чтобы мои данные загрузки сетки с фильтром из моего ввода текста, и сетка будет загружать данные, когда я нажимаю btnSearch:

@(Html.Kendo().Grid<ARM.Models.UserViewModel>()
                .Name("gridUsers")
                .Columns(columns =>
                {
                    columns.Bound(c => c.Code);
                    columns.Bound(c => c.LanID);
                    columns.Bound(c => c.DepartmentName);
                    columns.Bound(c => c.UserRole);
                    columns.Bound(c => c.Level);
                })
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .Read(read => read.Action("GetUserSample", "ApprovalManager").Data("filterLanID"))
                    .PageSize(20)
                )
            )

<script>
function filterLanID() {
        return {
            lanid: $('#txtFilterUserId').val().trim()
        };
    }
function btnSearchOnClick(){
        $('#gridUsers').data("kendoGrid").dataSource.read();
}
</script>

Контроллер:

public ActionResult GetUserSample([DataSourceRequest]DataSourceRequest request, string lanid)
        {
            IEnumerable<UserViewModel> userModel = GetListUser(lanid);
            return Json(userModel.ToDataSourceResult(request));
        }