Каков наилучший способ сохранения фильтров, подкачки, сортировки в .NET Core MVC

#c# #.net-core #asp.net-core-mvc

#c# #.net-core #asp.net-core-mvc

Вопрос:

Я разрабатываю приложение .NET Core MVC. Для моих операций CRUD у меня есть базовый Index.cshtml, Edit.cshtml и Create.cshtml страница. В моем Index.cshtml я могу сортировать, фильтровать страницы. Я добавляю эту информацию в строку запроса, например

 https://localhost:5001/admin/myPage?search=my search stringamp;page=3
  

Теперь, когда я редактирую строку, я перехожу на другую страницу. Возможно, на странице редактирования мне нужно будет перейти к другим страницам. В конце, когда я вернусь на свою страницу Index.cshtml, я хочу, чтобы был применен мой оригинальный фильтр.

Я знаю, что могу передавать ключи и значения строки запроса взад и вперед со страницы на страницу, но мне это кажется довольно сложным.

Каков наилучший способ реализовать это?

Комментарии:

1. Зависит от вашего приложения… Файлы cookie / localStorage? Сессия?

2. Вы также можете зайти так далеко, что сохраните данные в базе данных для пользователя — таким образом, сортировка может быть запомнена при следующем входе в систему

Ответ №1:

Вы могли бы использовать сеанс или cookie для хранения значений фильтров, разбиения на страницы и сортировки. В методе действия с индексом вы могли бы проверить, равно ли значение параметра null, затем вы могли бы запросить сеанс и попытаться найти предыдущие сохраненные значения и использовать их для фильтрации или сортировки данных. Если параметры не равны null, вы могли бы обновить значение сеанса.

Код, подобный этому (проверьте код, связанный с sortorder):

     public async Task<IActionResult> Index(string sortOrder,string currentFilter, string searchString, int? pageNumber)
    {
        if (searchString != null)
        {
            pageNumber = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        if(sortOrder != null)
        {
            //if sortOrder is not null, update the session to store the new sort order
            HttpContext.Session.SetString("sortOrder", sortOrder);
        }
        else
        {   //check if session contains the sort order.
            if(HttpContext.Session.GetString("sortOrder") != null)
            {
                //get sortOrder from session
                sortOrder = HttpContext.Session.GetString("sortOrder");
            }
            else
            {
                //session expired or is null, use the default sort order.
            }
        }

        ViewData["CurrentSort"] = sortOrder; 
        ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";


        var projects = from s in _context.Projects
                       select s;
        if (!String.IsNullOrEmpty(searchString))
        {
            projects = projects.Where(s => s.ProName.Contains(searchString));
        }
        switch (sortOrder)
        {
            case "name_desc":
                projects = projects.OrderBy(s => s.ProName);
                break; 
            default:
                projects = projects.OrderBy(s => s.ProID);
                break;
        }

        int pageSize = 3;
        return View(await PaginatedList<Projects>.CreateAsync(projects.AsNoTracking(), pageNumber ?? 1, pageSize));
        
    }
  

Вы могли бы обратиться к следующему коду для настройки сеанса в asp.net ядро (По умолчанию время ожидания сеанса составляет 20 минут, вы можете его изменить):

 public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    { 
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(30); //set session expire time
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });

        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseSession();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute();
            endpoints.MapRazorPages();
        });
    }
}
  

Более подробную информацию об использовании управления сеансами, пожалуйста, ознакомьтесь с Управлением сеансами и состояниями в ASP.NET Ядро.

Комментарии:

1. Спасибо за ответ! Я проверю, как это реализовать следующим образом.