保留/检索模型(列表)数据-Razor Pages

时间:2019-06-07 10:34:28

标签: c# razor-pages

我的问题可能很明显或很简单,但我似乎无法解决。

我有一个按钮,当按下该按钮时,它将从API端点(从另一家公司)检索JSON数据。该端点返回30000条记录。

检索到数据后,我将使用适当的模型将其显示到前端。这一切都很好。

我添加了一个在服务器端处理的搜索框,当给出搜索值时,它返回到检索数据的同一端点,但是,如果数据已经加载,则我不想再次检索数据。所以我想我可以使用Data属性模型来检查它是否为空。但是,这不起作用。

代码如下:

后端剃须刀页面:

public class IndexModel : PageModel
{
    private readonly IGetDataService _getDataService;

    [BindProperty]
    public List<DataModel> DataModel { get; set; }

    public string CurrentFilter { get; set; }


    public IndexModel(IGetDataService dataService)
    {
        _getDataService = dataService;
    }


    public async Task<IActionResult> OnGetLoadData(string searchString)
    {

        CurrentFilter = searchString;
        List<DataModel> data = null;

        // Check if data has already been retrieved
        if (DataModel == null)
            data = await _getDataService.ReadAll(new Uri("https://restapi.xxxxx"));
        else
            data = DataModel;



        if (!String.IsNullOrEmpty(searchString))
        {
            data.Where(s =>
                s.field1.Contains(searchString) ||
                s.field2.Contains(searchString) ||
                s.field3.Contains(searchString) ||
                s.field4.Contains(searchString) 
            );
        }

        DataModel = data;

        return Page();
    }
}

前端代码:

@page "{handler?}"
@model IndexModel
@{
    ViewData["Title"] = "Data page";
}



<form asp-page-handler="LoadData" asp-route-id="" method="get">
    <button id="lurvink-button" class="btn btn-primary">
        Get Data
    </button>
</form>


@if (Model.DataModel != null)
{

    <form class="form-group has-search" asp-page-handler="LoadData" method="get">
        <span class="fa fa-search form-control-feedback"></span>
        <input type="text" class="form-control" placeholder="Search" name="SearchString" value="@Model.CurrentFilter">
    </form>


    <table class="table">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.DataModel[0].field1)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.DataModel[0].field2)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.DataModel[0].field3)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.DataModel[0].field4)
                </th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.DataModel)
            {
                <tr>
                    <td>@item.field1</td>
                    <td>@item.field2</td>
                    <td>@item.field3</td>
                    <td>@item.field4</td>
                </tr>
            }
        </tbody>
    </table>
}

1 个答案:

答案 0 :(得分:1)

我对Razor Pages并不熟悉,但是希望(与普通的MVC一样)该状态不会通过多次调用保持。

您可以使用MemoryCache在特定时间内存储DataModel。