#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. Спасибо за ответ! Я проверю, как это реализовать следующим образом.