Я закончил тем, что изменил возвращаемые значения GetData
и PaginateData
в контроллере, чтобы вернуть модель в формате json для сохранения в javascript с помощью функции ajax success
, и добавил новый метод DisplayData
для возвратанесериализованный PartialView
.Я изменил PaginateData
и DisplayData
на вызовы HttpPost, принимая модель, которую мы сохранили в javascript.
Javascript (обратите внимание, что getdata, paginate и display соединяются через success
):
require(["jquery", "ajax"], function ($, ajax) {
var currentData = null;
var currentPage = null;
var actions = {
getData: function () {
ajax.html({
url: Router.action("Widgets", "GetData"),
interval: 3000,
maxAttempts: 20,
cache: false,
success: function (response) {
currentData = response;
actions.paginateData();
}
});
},
paginateData: function () {
ajax.html({
url: Router.action("Widgets", "DisplayData"),
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
interval: 3000,
maxAttempts: 20,
cache: false,
data: JSON.stringify({ data: currentData, startIndex: 0, pageSize: 10 }),
success: function (response) {
currentPage = response,
actions.displayData();
}
});
},
displayData: function () {
ajax.html({
url: Router.action("Widgets", "PaginateData"),
type: 'POST',
contentType: 'application/json; charset=utf-8',
interval: 3000,
maxAttempts: 20,
cache: false,
data: JSON.stringify(currentPage),
success: function (response) {
$('#view-dataList', $context).replaceWith(response);
}
});
}
}
}
Контроллер:
[Route("GetData")]
public ActionResult GetData()
{
var model = new DataModel();
var service = new SqlService();
var customerID = Identity.Current.OptaviaID.ToString();
model.Data = service.LoadData();
Content(JsonConvert.SerializeObject(model), "application/json");
}
[HttpPost]
[Route("PaginateData")]
public ActionResult PaginateData(DataModel data, int pageNumber, int pageSize)
{
data.Data = data.Data.Skip((pageNumber - 1) * pageSize).Take(pageSize);
Content(JsonConvert.SerializeObject(data), "application/json");
}
[HttpPost]
[Route("DisplayData")]
public ActionResult DisplayData(DataModel data)
{
return PartialView(data);
}
Теперь в моем javascript я могу вызвать getData
при загрузке страницы, чтобы получить данные, получить страницу по умолчанию и рассчитать, и отобразить ее, но я также могу вызватьpaginateData
когда пользователь меняет страницу или изменяет размер страницы, чтобы получить новую страницу и отобразить ее, не запрашивая базу данных снова, которая отвечает на этот вопрос.