Разбивать данные на страницы без повторения SQL-запросов с использованием ASP.NET MVC - PullRequest
0 голосов
/ 12 июня 2018

У меня большой набор данных из хранимой процедуры, который я хочу отобразить на страницах веб-страницы ASP.NET.Я не могу требовать от администраторов баз данных, поэтому попросить их поддержать нумерацию страниц по их окончанию невозможно.В настоящее время данные отображаются в виджете, который заполняется с помощью вызова ajax для действия в моем контроллере.Я хочу, чтобы пользователь мог изменять страницу и размер страницы без повторного запуска хранимой процедуры, но я не знаю, как передать данные / модель из вызова getData в вызов paginateData.

Ajax:

require(["jquery", "ajax"], function ($, ajax) {
    getData: function () {
        ajax.html({
            url: Router.action("Widgets", "GetData"),
            interval: 3000,
            maxAttempts: 20,
            cache: false,
            success: function (response) {
                $('#view-dataList', $context).replaceWith(response);
            }
        });
    }
    paginateData: function () {
        ajax.html({
            url: Router.action("Widgets", "PaginateData", {pageNumber: pageNumber, pageSize: pageSize, data: ??????}), 
            interval: 3000,
            maxAttempts: 20,
            cache: false,
            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.RecentActivities = service.LoadData();

    return PartialView(model);
}

[Route("PaginateData")]
public ActionResult PaginateData(int pageNumber, int pageSize, IList<Data> data)
{
    var model = new DataModel();
    var page = model.page.Skip((pageNumber - 1) * pageSize).Take(pageSize);
    model.Data = page;

    return PartialView(model);
}

Какой хороший способ создать это?

1 Ответ

0 голосов
/ 13 июня 2018

Я закончил тем, что изменил возвращаемые значения 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 когда пользователь меняет страницу или изменяет размер страницы, чтобы получить новую страницу и отобразить ее, не запрашивая базу данных снова, которая отвечает на этот вопрос.

...